当从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;
}