在Activity/Fragment中处理recyclerviewonclicklistener



当从ListView迁移到RecyclerView时,处理"onItemClick"似乎变得很痛苦。

两种最流行的方法之一是使ViewHolder实现View.OnClickListener并在那里处理onClick。下面是这种方法的一个例子。

从项目的ViewHolder到托管RecycleView的片段/活动并在那里处理它的良好做法是什么?

谢谢!

正如你所说的,有几种方法和实现取决于其余代码的设计,逻辑和你想要的对象的模块化程度。

  • 添加onItemClickListener到整个holder可以找到在这里,这是一个很好的方式,如果你只需要点击整个项目。注意:如果你要用它实现swipe2解散那么它会给你带来一些痛苦因为触摸事件和多个TouchEventListener
  • 让你的片段实现OnClickListener并将其传递给适配器,然后传递给holder,所以它会得到onClick您想要的holder中视图的事件,然后创建在片段处切换case来处理它。

我认为:最好的做法是传递OnClickListeners,因为当你想在不同的类中使用该视图并想要不同的点击处理时,它将更容易实现。

这段代码真的很适合我。把它放在你的活动类的oncreate()方法。

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) {
    }
});

你可以在viewholder中创建onclicklistener,并在activity中实现它下面是演示:https://github.com/yefengfreedom/YfRecyclerView

和下面的代码:

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

.........

public void setOnItemClickListener(RecyclerViewInterface.OnItemClickListener onItemClickListener) {
    mOnItemClickListener = onItemClickListener;
}

最新更新