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.
- Vista previa de recyclerview horizontal en android studio
- Las vistas devuelven NullPointerException en onBindViewHolder en RecyclerView Adapter
- La altura de la vista Recycler anidada no envuelve su contenido
- Los elementos no tienen el mismo ancho cuando se utiliza RecyclerView GridLayoutManager para establecer el espaciado de columnas por ItemDecoration
- Problema de RecyclerView OnScrollListener ()
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.
- Creación de una vista en forma de calendario con desplazamiento infinito en Android
- Los datos del adaptador RecycleView aparecen erróneos al desplazarse demasiado rápido
- Lazy Loading no funciona correctamente
- Problemas con la implementación del modo de acción contextual en fragmento recyclerview
- Biblioteca avanzada de RecyclerView - ejemplos de código
- RecyclerView onClick
- Deshabilitar ItemTouchHelper para una parte de un visor
- ¿Hay alguna manera de mostrar Google Admob en Android Recycler View
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 } }
- Activo HTML externo no incluido en React Nativo en la compilación de producción para su uso por Webview
- Android AsyncTask onPostExecute fuera del hilo principal de ui