Ошибка с переключением в RecyclerView с использованием пользовательского интерфейса Firebase

У меня проблема с переключателями в моем 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);
    }
}
}

Это когда он не переключается

Ошибка с переключением в RecyclerView с использованием пользовательского интерфейса Firebase

Это когда один из любого переключается

Ошибка с переключением в RecyclerView с использованием пользовательского интерфейса Firebase

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
128
1

Ответы 1

Вы получаете такое поведение, потому что вы устанавливаете слушателя на объект 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(/* ... */)
}

Да. Я пробовал это, но не сработало, так как не могу узнать позицию соответствующей карты.

Aravind M J 06.04.2018 19:57

Я тебя не понимаю. Когда вы вызываете метод setActive(), вы передаете логическое значение active, соответствующее каждой позиции. Разве это не то, что ты хочешь?

Alex Mamo 07.04.2018 10:29

Другие вопросы по теме