У меня проблема с переключателями в моем recyclerview. Я использую пользовательский интерфейс Firebase для заполнения данных из БД в recyclerview. У меня есть переключатель на каждой карте. Когда я переключаю переключатель на одной карте, переключатель на другой карте также переключается. Я не могу найти для этого причину.
public class MapFrag extends Fragment {
private RecyclerView recyclerView;
private DatabaseReference mDatabase;
private FirebaseRecyclerAdapter<MapRecycler, MapFrag.MapViewHolder> firebaseRecyclerAdapter;
public MapFrag() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_map, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mDatabase = FirebaseDatabase.getInstance().getReference().child("LocData").child("TestUser");
recyclerView = (RecyclerView)view.findViewById(R.id.maprecycler);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
@Override
public void onStart() {
super.onStart();
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MapRecycler, MapFrag.MapViewHolder>(
MapRecycler.class,
R.layout.map_card_list,
MapFrag.MapViewHolder.class,
mDatabase
) {
@Override
protected void populateViewHolder(final MapFrag.MapViewHolder viewHolder, final MapRecycler model, final int position) {
final String key = firebaseRecyclerAdapter.getRef(position).getKey();
viewHolder.Name.setText(model.getName());
Picasso.with(getContext()).load(model.getImage()).into(viewHolder.map_image);
viewHolder.map_image.setScaleType(ImageView.ScaleType.FIT_XY);
viewHolder.active_switch.setChecked(model.getActive());
mDatabase.child(key).child("key").setValue(key);
viewHolder.active_switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (b){
mDatabase.child(key).child("active").setValue(true);
}
else {
mDatabase.child(key).child("active").setValue(false);
}
}
});
viewHolder.delete_map.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDatabase.child(key).removeValue();
}
});
}
};
recyclerView.setAdapter(firebaseRecyclerAdapter);
}
public static class MapViewHolder extends RecyclerView.ViewHolder{
View mView;
TextView Name;
ImageView map_image;
Switch active_switch;
ImageButton delete_map;
public MapViewHolder(View itemView) {
super(itemView);
//mView = itemView;
Name = (TextView)itemView.findViewById(R.id.map_name);
map_image = (ImageView)itemView.findViewById(R.id.map_img);
active_switch = (Switch)itemView.findViewById(R.id.active_state);
delete_map = (ImageButton) itemView.findViewById(R.id.map_delete);
}
public void setName(String name){
TextView Name = (TextView)mView.findViewById(R.id.map_name);
Log.e(name, "setStart: ");
Name.setText(name);
}
public void setImage(Context ctx, String image){
ImageView map_image = (ImageView)mView.findViewById(R.id.map_img);
Log.e(image, "ImgData: ");
Picasso.with(ctx).load(image).into(map_image);
}
public void setActive(Boolean active){
Switch act_switch = (Switch)mView.findViewById(R.id.active_state);
act_switch.setChecked(active);
}
}
}
Это когда он не переключается
Это когда один из любого переключается




Вы получаете такое поведение, потому что вы устанавливаете слушателя на объект viewHolder внутри метода populateViewHolder:
viewHolder.active_switch.setOnCheckedChangeListener(/* ... */)
Вам не нужно этого делать, вам нужно добавить слушателя в свой класс MapViewHolder внутри метода setActive следующим образом:
public void setActive(Boolean active){
Switch act_switch = (Switch)mView.findViewById(R.id.active_state);
act_switch.setChecked(active);
act_switch.setOnCheckedChangeListener(/* ... */)
}
Я тебя не понимаю. Когда вы вызываете метод setActive(), вы передаете логическое значение active, соответствующее каждой позиции. Разве это не то, что ты хочешь?
Да. Я пробовал это, но не сработало, так как не могу узнать позицию соответствующей карты.