【问题标题】:How to click a View which is visible behind a RecyclerView's invisible ViewHolder item?如何单击在 RecyclerView 的不可见 ViewHolder 项目后面可见的视图?
【发布时间】:2018-01-04 02:10:10
【问题描述】:

我有一个全屏 RecyclerView,它将有一个不可见的 ViewHolder 项,如下所示

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
   .... 
   if (position == 6) {
      viewHolder.itemView.setMinimumHeight(Resources.getSystem().getDisplayMetrics().heightPixels);
      viewHolder.itemView.setVisibility(View.GONE);
      viewHolder.setIsRecyclable(false);
   }
   ...

}

一旦位置 6 出现在屏幕上,我可以看到它后面的 ImageView,我希望能够点击它。我已经向该 ImageView 添加了一个事件处理程序,但它没有被触发。似乎 RecyclerView 正在阻止点击事件冒泡。有什么方法可以通过不可见/消失的 RecyclerView ViewItem 单击视图?

【问题讨论】:

标签: android-recyclerview onclicklistener


【解决方案1】:

自从我提出这个问题以来,我已经尝试了多种技术/方法,这些技术/方法可以/应该将点击/点击事件向下传递到视图层次结构,但没有任何效果。我试图在应用程序中构建的功能非常复杂,应用程序本身随着时间的推移变得非常复杂。太多的相互叠加的视图和全局事件处理程序使实施变得更加困难。

所以我决定作为最后的手段,在 RecyclerView 中有一个空/透明的视图持有者,它监听点击和触摸事件,并根据触摸事件的坐标,我触发不同的动作。代码如下:

private float[] lastTouchDownXY = new float[2];

public MyView getMyView(final Context context) {       
    MyView view = new MyView(context);

    view.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                lastTouchDownXY[0] = motionEvent.getRawX();
                lastTouchDownXY[1] = motionEvent.getRawY();
            }

            return false;
        }
    });

    view.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final float x = lastTouchDownXY[0];
            final float y = lastTouchDownXY[1];
            int[] mLocButton = new int[2];
            // mButton is the button in the background and visible thru transparent viewholder
            mButton.getLocationOnScreen(mLocButton);
            final int left = mLocButton[0];
            final int top = mLocButton[1];

            if (x > (left - mOffset) && x < (left + mOffset + mButtonWidth) &&
                    y > (top - mOffset) && y < (top + mOffset + mMuteUnmuteButtonHeight)) {
                // mButton clicked
            } else {
                // entire view clicked except mButton clickable area
            }
        }
    });

    return view;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2023-04-10
    • 2018-08-05
    相关资源
    最近更新 更多