使用Firebase UI在RecyclerView中切换的错误

时间:2018-03-30 16:08:06

标签: java android firebase android-recyclerview firebaseui

我的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);
    }
}
}

这是在没有切换的时候

enter image description here

当其中任何一个被切换时

enter image description here

1 个答案:

答案 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(/* ... */)
}