Evento de toque de la manija para los artículos dentro de Recyclerview – android

Estoy construyendo un reciclerview simple con la disposición de encargo (visión y el interruptor del texto) y un adaptador de encargo.

Mi problema es que no puedo manejar el acontecimiento del tecleo para el interruptor (que lo hacen cambiar su estado), he construido un oyente del tacto para el recyclerview y él se enciende cada vez que hago clic en el interruptor.

Después de un montón de pruebas el detector de contacto de conmutación dispara también, pero quiero desactivar el evento de toque para el recyclerView si se hace clic en el interruptor.

Aquí está mi código de diseño:

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

Este es mi código de adaptador:

 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"); } } 

Y aquí está mi controlador de touch de 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) { } } 

Y en el método onCreate lo llamo a través de:

 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; } })); 

Cualquier ayuda por favor, ya he probado un montón de soluciones, pero nada funcionó para lo siento.

Gracias por adelantado.

Una forma es actualizar su titular para manejar cualquier clic de vista internamente, por ejemplo

 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 } } 
  • La mejor manera de actualizar datos con un adaptador RecyclerView
  • Onclicklistener no está trabajando en recyclerview
  • El trabajo de CollapsingTolbar con fagment contiene SwipeRefreshLayout y RecycleView
  • ¿Mostrar diferente viewType en RecyclerView basado en información en la base de datos?
  • Cómo hacer la primera imagen más grande en Gridlayout?
  • ¿Puedo usar más de 2 vistas de reciclador en una actividad?
  • RecyclerView BackgroundColor
  • RecyclerView.Adapter.notifyItemMoved (0,1) desplaza la pantalla
  • RecyclerView in DialogFragment -> arrastre y suelte (swap) retrasos de animación
  • RecyclerView wrap_content con GridLayoutManager
  • RecyclerView ItemTouchHelper borrar eliminar animación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.