with tutorial recyclerview problem dependency cardview java android android-recyclerview toggle

java - tutorial - recyclerview dependency



Deshabilite todos los demás botones de alternar en la vista de reciclador después de hacer clic en uno (3)

Hay un par de cosas que estás haciendo incorrectamente. El ViewHolder solo debe contener vistas y no hacer clic en controladores o cadenas, etc. (La pista está en el nombre). Agregue los controladores y manipule las vistas cuando vincula el ViewHolder a su clase de datos.

Por lo que puedo determinar, quieres una lista simple de botones para alternar. Cuando un botón está activado, los demás deben apagarse. El adaptador de prueba que creé para usted a continuación lo demuestra.

Idealmente, evitará notifyDataSetChanged y usará las versiones basadas en filas, pero como cada vez que se presione la tecla Alternar, afectará a cada otra fila, realmente no tiene opción en este caso de uso a menos que realice un seguimiento de la fila seleccionada.

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.VH> { public static class MyData { public boolean Selected = false; public String Text; public MyData(String text) { Text = text; } } public List<MyData> items = new ArrayList<>(); public TestAdapter() { this.items.add(new MyData("Item 1")); this.items.add(new MyData("Item 2")); this.items.add(new MyData("Item 3")); } @Override public TestAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) { return new VH(( LayoutInflater.from(parent.getContext()) .inflate(R.layout.test_layout, parent, false)) ); } @Override public void onBindViewHolder(TestAdapter.VH holder, int position) { final MyData itm = items.get(position); holder.button.setChecked(itm.Selected); holder.text.setText(itm.Text); holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { for (MyData x: items){ x.Selected=false; } itm.Selected = true; notifyDataSetChanged(); } }); } @Override public int getItemCount() { return items.size(); } public class VH extends RecyclerView.ViewHolder { ToggleButton button; TextView text; public VH(View itemView) { super(itemView); button = itemView.findViewById(R.id.toggle); text = itemView.findViewById(R.id.text1); } } }

test_layout.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <ToggleButton android:id="@+id/toggle" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/text1" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>

Estoy utilizando recyclerView para crear una lista de botones de alternar (como un teclado numérico), me gustaría lograr:

  • cuando el usuario ''enciende'' un botón haciendo clic en él, ''apaga'' todos los demás botones

Intenté agregar un onClickListener dentro de la clase del titular de la vista, y invocar notifyDataSetChanged() que se onBindViewHolder(final ViewHolder holder, int position) y luego cambie el estado del botón.

Pero no funciona, el botón presionado no cambia su estado.

ViewHolder

class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ ToggleButton button; String id; public ViewHolder(View itemView) { super(itemView); button = (ToggleButton) itemView.findViewById(R.id.toggle); button.setOnclickListener(this); } @Override public void onClick(View view) { ((ToggleButton) view).setChecked(true); int pos = getAdapterPosition(); if (pos != RecyclerView.NO_POSITION) { selected = pos; //store the position of the user clicked button notifyDataSetChanged(); } }

onBindViewHolder () en mi clase adpater

public void onBindViewHolder(final ViewHolder holder, int position) { String data = mData.get(position); holder.id = data; holder.button.setText(data); holder.button.setTextOn(data); holder.button.setTextOff(data); if (position != selected) { //if the button is not the user chosen one if (holder.button.isChecked()) { // and it''s in ''ON'' state holder.button.toggle(); // toggle it to switch ''OFF'' } }


Intenta configurar OnCheckedChangeListener lugar de ''OnclickListener`

`button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { // The toggle is enabled } else { // The toggle is disabled } } });`

Android Doc: https://developer.android.com/guide/topics/ui/controls/togglebutton.html


active el oyente click en onBindView y en el método onClick, primero "apague" todo el botón de alternar configurando un parámetro en el modelo de lista y luego "encienda" el seleccionado si no está seleccionado.

@Override public void onClick(View view) { // clear all model values to isSelected false in the list }