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
和handleonClick
。是这种方法的一个例子
从项目的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) {
}
});