我正在包含所有视图的主布局上实现onClick
,以便将数据传递到另一个视图,例如:
holder.wholeView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, String.valueOf(position), Toast.LENGTH_SHORT).show();
//pass data with something like eventBus and transition to another view
}
});
我认为有更好的方法可以做到这一点吗?
使用这个:
public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {
public interface ClickListener {
void onClick(View view, int position);
void onLongClick(View view, int position);
}
private GestureDetector gestureDetector;
private ClickListener clickListener;
public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
this.clickListener = clickListener;
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null) {
clickListener.onLongClick(child, recyclerView.getChildPosition(child));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
clickListener.onClick(child, rv.getChildPosition(child));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
从您正在使用回收器视图的活动中,可以像这样使用它:
mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, mRecyclerView,
new RecyclerTouchListener.ClickListener() {
@Override
public void onClick(View view, int position) {
// use this position to fetch the data from your list which you used to populate your recylcer view
}
@Override
public void onLongClick(View view, int position) {
}
}));
您应该具有从中创建回收器视图项目的项目列表。现在只需使用这个
myList.get(holder.getAdapterPosition());
这将返回单击位置的对象。
希望这有帮助。