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
}