You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:06:05