我的recyclerview中的交换机出现问题。我正在使用Firebase UI将数据从DB填充到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);
}
}
}
这是在没有切换的时候
当其中任何一个被切换时
答案 0 :(得分:0)
您收到此行为是因为您在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(/* ... */)
}