如何点击在RecyclerView的隐形ViewHolder项目后面可见的视图?

时间:2017-10-19 19:13:39

标签: android-recyclerview onclicklistener

我有一个全屏的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阻止了点击事件的泡沫。有没有办法点击View to through thru / gone RecyclerView ViewItem?

1 个答案:

答案 0 :(得分:0)

由于我问了这个问题,我尝试了多种技术/方法,可以/应该将点击/点击事件传递给视图层次结构,但没有任何效果。我试图在应用程序中构建的功能非常复杂,应用程序本身也变得非常复杂。过多的视图和全局事件处理程序使得实现更加困难。

所以我已经决定在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;
 }