Android开发之RecyclerView像ListView一样setOnItemClickListener

asdfasdf

先定义一个接口:

    /**
     * Interface definition for a callback to be invoked when an item in this
     * AdapterView has been clicked.
     */
    public interface OnItemClickListener {
        /**
         * Callback method to be invoked when an item in this AdapterView has
         * been clicked.
         * <p>
         * Implementers can call getItemAtPosition(position) if they need
         * to access the data associated with the selected item.
         *
         * @param parent   The RecyclerView where the click happened.
         * @param view     The view within the AdapterView that was clicked (this
         *                 will be a view provided by the adapter)
         * @param position The position of the view in the adapter.
         * @param id       The row id of the item that was clicked.
         */
        void onItemClick(ViewGroup parent, View view, int position, long id);
    }
复制代码

定义一个成员变量:

   /**
     * The listener that receives notifications when an item is clicked.
     */
    private OnItemClickListener onItemClickListener;
复制代码

定义一个方法:

   /**
     * Register a callback to be invoked when an item in this RecyclerView has
     * been clicked.
     *
     * @param listener The callback that will be invoked.
     */
    public void setOnItemClickListener(@NonNull OnItemClickListener listener) {
        onItemClickListener = listener;
    }
复制代码

    /**
     * item点击事件监听器
     */
    private class ItemClickListener implements OnItemTouchListener {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            if (BuildConfig.DEBUG) {
                LogUtil.d("e.getX() = " + e.getX() + ", e.getY() = " + e.getY());
            }
            final View childView = rv.findChildViewUnder(e.getX(), e.getY());
            if (childView != null && onItemClickListener != null && gestureDetector.onTouchEvent(e)) {
                final int position = rv.getChildAdapterPosition(childView);
                final Adapter adapter = getAdapter();
                if (adapter instanceof BaseAdapter) {
                    final BaseAdapter baseAdapter = (BaseAdapter) adapter;
                    final int adjPosition = position - baseAdapter.getHeadersCount();
                    final int[] resIds = baseAdapter.getClickItemViewResIds();
                    final int count = (resIds == null || resIds.length == 0) ? 0 : resIds.length;
                    if (BuildConfig.DEBUG) {
                        LogUtil.d("Item click view count is " + count);
                    }
                    if (count > 0) {
                        View itemView;
                        for (int i = 0; i < resIds.length; i++) {
                            itemView = childView.findViewById(resIds[i]);
                            if (itemView != null) {
                                int[] location = new int[2];
                                itemView.getLocationInWindow(location); // 获取在当前窗口内的绝对坐标
                                if (e.getRawX() >= location[0] && e.getRawX() <= location[0] + itemView.getWidth() && e.getRawY() >= location[1] && e.getRawY() <= location[1] + itemView.getHeight()) {
                                    return false;
                                } else {
                                    if (i == count - 1) {
                                        onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
                                        return false;
                                    }
                                }
                            } else {
                                onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
                                return false;
                            }
                        }
                    } else {
                        onItemClickListener.onItemClick(rv, childView, adjPosition, adapter.getItemId(adjPosition));
                        return false;
                    }
                } else {
                    onItemClickListener.onItemClick(rv, childView, position, adapter.getItemId(position));
                }
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值