处理Recyclerview – android内的项目的触摸事件

我正在构build一个简单的自定义布局(文本视图和开关)和一个自定义适配器recyclerview。

我的问题是我无法处理交换机的点击事件(这使得它切换其状态),我已经build立了一个触摸监听器为recyclerview,它每次点击开关时触发。

经过大量的尝试,开关触摸侦听器也会触发,但是如果点击了开关,我想禁用recyclerView触摸事件。

这是我的布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="60.0dip" android:layout_weight="1.0" android:orientation="horizontal" android:paddingLeft="16dp"> <TextView android:id="@+id/category_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="false" android:layout_centerVertical="true" android:layout_gravity="center_vertical" android:text="Category Name" android:textAppearance="?android:textAppearanceLarge" /> <android.support.v7.widget.SwitchCompat android:id="@+id/category_switch" android:layout_width="80dp" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_gravity="center_vertical" android:checked="true" android:clickable="true" android:focusable="false" android:focusableInTouchMode="false" android:paddingRight="16dp" /> </RelativeLayout> 

这是我的适配器代码:

 public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View row = layoutInflater.inflate(R.layout.single_row_category, parent, false); CategoryViewHolder holder = new CategoryViewHolder(row); return holder; } public void onBindViewHolder(CategoryViewHolder holder, final int position) { AlarmCategory thisCat = categories.get(position); holder.catName.setText(thisCat.getCategoryName()); holder.catStatus.setChecked(thisCat.isOn()); holder.catStatus.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { Log.d("fpp", view.getClass().getName() + " is clicked"); return true; } }); } public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener { public TextView catName; public SwitchCompat catStatus; public CategoryViewHolder(View itemView) { super(itemView); itemView.setOnCreateContextMenuListener(this); catName = (TextView) itemView.findViewById(R.id.category_name); catStatus = (SwitchCompat) itemView.findViewById(R.id.category_switch); } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) { menu.add(0, 1001, 0, "Edit");//groupId, itemId, order, title menu.add(0, 1002, 1, "Delete"); } } 

这里是我的recyclerView触摸处理程序:

 class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 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 = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child, rv.getChildPosition(child)); Log.d("fpp", child.getClass().getName() + " is clicked"); return false; } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } 

并在onCreate方法我打电话通过:

 recyclerView.addOnItemTouchListener(new RecyclerTouchListener(this, recyclerView, new ClickListener() { @Override public void onClick(View view, int position) { Intent i = new Intent(CategoriesList.this, AlarmList.class); i.putExtra("catID", categories.get(position).getCategoryID()); startActivity(i); } @Override public void onLongClick(View view, int position) { catPos = position; } })); 

任何帮助,我已经尝试了很多解决scheme,但没有工作的抱歉。

提前致谢。

Solutions Collecting From Web of "处理Recyclerview – android内的项目的触摸事件"

一种方法是更新您的持有人以处理任何查看点击内部,例如

 public class CategoryViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener, CompoundButton.OnSetCheckedListener { public CategoryViewHolder(View itemView) { super(itemView); itemView.setOnCreateContextMenuListener(this); itemView.setOnClickListener(this); catName = (TextView) itemView.findViewById(R.id.category_name); catStatus = (SwitchCompat) itemView.findViewById(R.id.category_switch); catStatus.setOnCheckChangedListener(this); } public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // deal with catStatus change } public void onClick(View view) { // deal with itemView click } }