【问题标题】:How to get specific view touched/clicked from RecyclerView?如何从 RecyclerView 中触摸/单击特定视图?
【发布时间】:2015-02-22 23:33:54
【问题描述】:

我有一个包含项目列表的 RecyclerView。每个项目都是一个包含四个文本视图的相对布局。我想做的是能够区分单击了列表项的哪个文本视图,然后基于此执行操作。

我现在正在使用

final GestureDetector mGestureDetector = new GestureDetector(MyShiftsPageFragment.this.getActivity(), new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }
    });
    shiftList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
            ViewGroup child = (ViewGroup) recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());

            if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {
                Log.i(TAG, child.toString());
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
            Log.i(TAG, "TouchEvent");
        }
    });

但它似乎只找到了RelativeLayout,而不是该布局之上的单个组件。有任何想法吗?或者我应该采取不同的方式来做到这一点?

【问题讨论】:

  • 您为什么不在TextViews 上注册OnClickListenerOnTouchListener
  • 我会在哪里做呢?在我的适配器的 ViewHolder 类中?
  • "在我的适配器中的 ViewHolder 类中?" -- 当然。

标签: android list touch adapter android-recyclerview


【解决方案1】:

这是我整理的示例中的一些代码,事件似乎正确触发。

    public static class ViewHolder extends RecyclerView.ViewHolder implements OnClickListener, OnCheckedChangeListener {

        private CheckBox mCheckBox;

        public ViewHolder(View itemView) {
            super(itemView);
            mCheckBox = (CheckBox) itemView.findViewById(R.id.checkBox1);
            mCheckBox.setOnCheckedChangeListener(this);
            itemView.setOnClickListener(this);
        }

        public CheckBox getCheckBox() {
            return mCheckBox;
        }

        @Override
        public void onClick(View v) {
            Log.d("CustomAdapter.ViewHolder", "item onClick()");
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            Log.d("CustomAdapter.ViewHolder", "checkbox onCheckChanged()");
        }

    }

当然,您不必让 ViewHolder 实现侦听器接口,您可以根据需要创建侦听器。

【讨论】:

  • 好吧,我想保留项目选择功能,因为我希望选择区域是 TextView 或项目的其余部分。
  • 好的,我做了一些研究,而不是使用 OnItemTouchListener,您可以在 ViewHolder 中实现 onClickListener 并在创建 ViewHolder 时在项目的视图上注册监听器。您可能仍然需要在视图上使用 descendantFocusability 以使 TextView 单击与项目单击共存。您可以尝试在项目的视图上设置 android:descendantFocusability="blocksDescendants" 并在 TextViews 上设置 android:textIsSelectable="false"。我还没有使用 RecyclerView,所以今晚我将一起编写一些代码并更新我的答案。
  • @bohica 在您的示例中,如何获取点击项目的位置?
  • ViewHolder 有一个 getPosition() 方法,因此假设您的侦听器是 ViewHolder 的内部类(我没有这样做),您可以在您的侦听器中调用 getPosition()。我应该做一个更完整的例子,但我有点急于检查事件是否正确排序。
  • @Mike Reinhart 如果这对您有用,请接受我的正确回答 - thx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多