继承RecyclerView做自定义改造时如何获取被点击item的位置
实现方案
你可以通过给自定义RecyclerView添加OnItemTouchListener监听点击事件,结合GestureDetector判断点击行为,最终获取点击的item位置更新变量,具体实现如下:
1. 完善init()方法逻辑
在你预留的init()方法中添加触摸监听和手势检测器即可,代码示例:
private void init() { // 初始化手势检测器,识别单指点击事件 GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { // 查找点击位置对应的item视图 View childView = findChildViewUnder(e.getX(), e.getY()); if (childView != null) { // 获取点击item对应的适配器位置 int position = getChildAdapterPosition(childView); // 更新当前点击的item位置变量 currentClickedItem = position; } return true; } }); // 给RecyclerView添加触摸监听器,将事件转发给手势检测器处理 addOnItemTouchListener(new SimpleOnItemTouchListener() { @Override public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) { return gestureDetector.onTouchEvent(e); } }); }
2. 可选扩展:对外暴露点击回调
如果需要让外部使用该自定义RecyclerView的地方也能收到点击事件,可以额外定义回调接口:
// 定义点击回调接口 public interface OnItemClickListener { void onItemClick(int position); } private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener listener) { this.onItemClickListener = listener; }
之后在onSingleTapUp方法更新完currentClickedItem后,增加回调触发逻辑即可:
if (onItemClickListener != null) { onItemClickListener.onItemClick(currentClickedItem); }
该方案不需要在Adapter中额外添加点击逻辑,所有点击处理逻辑都收敛在自定义RecyclerView内部,符合自定义改造的需求,后续要扩展点击动画、点击统计等功能也可以直接在该类中实现。
内容的提问来源于stack exchange,提问作者user1695123
相关产品推荐
相关产品推荐

