Android 在活动/片段中处理RecyclerView OnClickListener

Android 在活动/片段中处理RecyclerView OnClickListener,android,android-recyclerview,Android,Android Recyclerview,从ListView迁移到RecyclerView时,处理“onItemClick”似乎变得很痛苦 两种最流行的方法之一是使您的ViewHolder实现View.OnClickListener和handleonClick。是这种方法的一个例子 从项目的ViewHolder向托管RecycleView的片段/活动触发此“onClick”并在那里进行处理的最佳做法是什么 谢谢 正如您所说,有几种方法,实现取决于其余代码的设计、逻辑以及您希望对象的模块化程度 可以找到将侦听器添加到整个保持架中 和 这

ListView
迁移到
RecyclerView
时,处理“onItemClick”似乎变得很痛苦

两种最流行的方法之一是使您的
ViewHolder
实现
View.OnClickListener
和handle
onClick
。是这种方法的一个例子

从项目的
ViewHolder
向托管
RecycleView
的片段/活动触发此“onClick”并在那里进行处理的最佳做法是什么


谢谢

正如您所说,有几种方法,实现取决于其余代码的设计、逻辑以及您希望对象的模块化程度

  • 可以找到将侦听器添加到整个保持架中 和 这是一个很好的方法,如果你只需点击整个项目。注意:如果您要用它实现swipe2dismiss,那么它会因为touch事件和多个TouchEventListener而给您带来一些痛苦
  • 让您的片段实现OnClickListener并将其传递给 适配器,然后将其传递给支架,使其获得onClick 所需支架中视图的事件,然后创建 在片段处切换case以处理它

IMO:最佳实践是传递OnClickListeners,因为这样,当您希望在不同的类中使用该视图并希望使用不同的单击处理时,它将更容易实现

您可以在viewholder内创建onclicklistener,并在活动中实现它 以下是演示:

代码如下:

/**
 * click recycler view item
 *
 * @param <T> t
 */
public interface OnItemClickListener<T> {
    void onItemClick(View view, T t);
}

这个代码对我来说真的很有用。将它放在
oncreate()
方法中的Activity类中

final GestureDetector mGestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() {

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return true;
    }

});

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
        View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());


        if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
            drawerLayout.closeDrawers();
            //  Toast.makeText(MainActivity.this, "The Item Clicked is: " + recyclerView.getChildPosition(child), Toast.LENGTH_SHORT).show();
            // below code get the position of data
            int a=recyclerView.getChildPosition(child);


            return true;

        }

        return false;
    }

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

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});

那么,将
onClickListener
传递给viewHolder是最佳实践吗?考虑到您有多个
viewHolder
s,每个都包含对片段的引用,我想知道潜在的问题是什么?每个都指向内存中相同的位置。另外,没有任何方法(除非你做了一些特别的事情)可以让持有者比碎片活得更长,这样就不会有内存泄漏的问题。我同意。如果您的答案中包含代码快照,这将非常好,主要是为了让更多的读者从中受益,您认为呢?没问题,但几天后:)
final GestureDetector mGestureDetector = new GestureDetector(MainActivity.this, new GestureDetector.SimpleOnGestureListener() {

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return true;
    }

});

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    @Override
    public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
        View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());


        if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
            drawerLayout.closeDrawers();
            //  Toast.makeText(MainActivity.this, "The Item Clicked is: " + recyclerView.getChildPosition(child), Toast.LENGTH_SHORT).show();
            // below code get the position of data
            int a=recyclerView.getChildPosition(child);


            return true;

        }

        return false;
    }

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

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
});