简体   繁体   English

RecyclerView的OnItemClick在其子项的OnClick之前触发

[英]RecyclerView's OnItemClick triggering before its child's OnClick

I am having some problems in my school project. 我的学校项目遇到一些问题。 My RecyclerView's OnItemClick is being triggered when I click on an ImageButton that is inside of it. 当我单击其中的ImageButton时,将触发RecyclerView的OnItemClick

CODE

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
  @Override
  public void onItemClick(View view, int position) {
    viewComments(posts.get(position));
  }

  @Override
  public void onItemLongClick(View view, int position) {

  }
}));

And here's the RecyclerItemClickListener code: 这是RecyclerItemClickListener代码:

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {

  private OnItemClickListener mListener;
  private GestureDetector mGestureDetector;

  public interface OnItemClickListener {
    void onItemClick(View view, int position);

    void onItemLongClick(View view, int position);
  }

  public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;

    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
      @Override
      public boolean onSingleTapUp(MotionEvent e) {
        View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());

        if (childView.findViewById(R.id.btnRateUp).isPressed() || childView.findViewById(R.id.btnRateDown).isPressed()) {
          return false;
        }

        return true;
      }

      @Override
      public void onLongPress(MotionEvent e) {
        View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());

        if (childView != null && mListener != null) {
          mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
        }
      }
    });
  }

  @Override
  public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    View childView = view.findChildViewUnder(e.getX(), e.getY());

    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
      mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
    }

    return false;
  }

  @Override
  public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
  }

  @Override
  public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
  }
}

This is what I came up with to detect if the child was getting the click, 这就是我想出的办法,以检测孩子是否获得了点击,

if(childView.findViewById(R.id.btnRateUp).isPressed() || childView.findViewById(R.id.btnRateDown).isPressed())

but I have realized the method isPressed() takes longer than the RecyclerView's OnItemClick to process. 但是我已经意识到,方法isPressed()花费的时间比RecyclerView的OnItemClick花费的时间更长。 The code only works when I don't tap on it quickly. 该代码仅在我没有快速点击时起作用。

btnRateUp and btnRateDown are ImageButtons and their OnClick events are being implemented in the Adapter's onBindViewHolder as follows: btnRateUp和btnRateDown是ImageButton,它们的OnClick事件在适配器的onBindViewHolder ,如下所示:

holder.getBtnRateUp().setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    doStuff(true);
  }
});

holder.getBtnRateDown().setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    doStuff(false);
  }
});

I solved the problem by changing the way I was doing it completely. 我通过改变完全的方式解决了这个问题。 Followed this tutorial. 遵循了教程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView更新项目的文本和图标OnClick - RecyclerView update item's text and icon OnClick RecyclerView滚动到子视图的子位置 - RecyclerView scroll to position of child view's child RecyclerView的onClick方法会使应用程序崩溃 - RecyclerView's onClick method crashes the app RecyclerView 更新单项的子项 - RecyclerView Update Single Item's Child 我的视图的onClick会触发整个布局中的任何位置 - My View's onClick is triggering anywhere on the whole layout 根据项目的高度设置 RecyclerView 的高度 - Set RecyclerView's height based on its item's height RecyclerView 行 onClick 和子按钮 onClick - RecyclerView row onClick and child button onClick 如何使用 java 在 android Studio 中从子 RecyclerView 的组件更新父 RecyclerView 的组件? - How to update Parent RecyclerView's components from child RecyclerView's components in android Studio using java? Android:在另一个活动(由RecyclerView启动)调用finish()后无意中激活了RecyclerView项目的onClick() - Android: RecyclerView item's onClick() unintentionally activated after call to finish() by another activity (which was started by that RecyclerView) 如何从整数值获取RecyclerView的子级? - How to get RecyclerView's child from integer value?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM