首页 > 解决方案 > 如果在recyclerview适配器中退出应用程序,Android如何保存复选框状态

问题描述

我在 onBindViewHolder 函数中有 RecycerView 适配器和复选框。如果我退出应用程序,我需要保存复选框的“选中”或“未选中”状态。我已经尝试过 SharedPreferences,但我无法在 Adapter 中使用它,我该怎么做?

代码适配器:

private lateinit var databaseReferenceFavorite: DatabaseReference
private lateinit var id: String

inner class ViewHolder(val binding: CarsListBinding): RecyclerView.ViewHolder(binding.root)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    return ViewHolder(CarsListBinding.inflate(LayoutInflater.from(parent.context), parent, false))
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    with(holder) {
        with(carsList[position]) {
            Picasso.with(itemView.context).load(image).into(binding.ivCar)
            binding.tvCar.text = this.name

            binding.cbFavorite.setOnCheckedChangeListener { checkBox, isChecked ->
                if (checkBox.isChecked) {
                    val image: String = this.image
                    val name: String = this.name

                    databaseReferenceFavorite = FirebaseDatabase.getInstance().reference
                        .child("Cars")
                        .child("Favorite Item")

                    val favorite = Favorite(name, image)

                    id = databaseReferenceFavorite.push().key.toString()
                    databaseReferenceFavorite.child(id).setValue(favorite)

                    Toast.makeText(itemView.context, "Item added to favorite", Toast.LENGTH_SHORT).show()
                } else {
                    databaseReferenceFavorite = FirebaseDatabase.getInstance().getReference("Cars").child("Favorite Item").child(id)
                    databaseReferenceFavorite.removeValue()

                    Toast.makeText(itemView.context, "Item removed from favorite", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

override fun getItemCount(): Int {
    return carsList.size
}

标签: androidkotlinfirebase-realtime-databasecheckboxandroid-recyclerview

解决方案


首先,将您的 firebase 数据库操作从适配器移动到 Activity/Fragment 并替换为接口:

    private AdapterListener mListener;

    inner class ViewHolder(val binding: CarsListBinding): RecyclerView.ViewHolder(binding.root)
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(CarsListBinding.inflate(LayoutInflater.from(parent.context), parent, false))
    }
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        with(holder) {
            with(carsList[position]) {
                Picasso.with(itemView.context).load(image).into(binding.ivCar)
                binding.tvCar.text = this.name
    
                binding.cbFavorite.setOnCheckedChangeListener { checkBox, isChecked ->
                    if (checkBox.isChecked) {
                        mListener.onFavoriteClick(carsList[position], true);
                    }else{
                        mListener.onFavoriteClick(carsList[position], false);
                    }
                }
            }
        }
    }
    
    override fun getItemCount(): Int {
        return carsList.size
    }

public void setListener(AdapterListener listener) {
        this.mListener = listener;
    }

    public interface AdapterListener {

        void onItemClick(Car item);
        void onFavoriteClick(Car item, boolean isFavorite);
    }

在活动或片段中:

public class YourActivity extends Activity
        implements YourAdapter.AdapterListener {
        ...
        mCarRef = mDatabase.child("Cars"));

@Override
    public void onFavoriteClick(Car item, boolean isFavorite) {
      checkFavorite(mCarRef);
    }

private void checkFavorite(Car item, DatabaseReference reference){

        reference.child(item.getId())
                .child("Favorites")
                .child("userId").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                String favorite = dataSnapshot.getValue(String.class);

                if (favorite != null){
                    removeFavoriteFromCars("userId");
                   
                }else {
                    addFavoriteToCars("userId");
            
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

    }

private void addFavoriteToCars(String userId) {

        mCarRef.child("Favorites").child(userId).setValue(userId)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                    }
                });
    }

    private void removeFavoriteFromCars(String userId) {

        mCarRef.child("Favorites").child(userId).removeValue(new DatabaseReference.CompletionListener() {
            @Override
            public void onComplete(@Nullable DatabaseError databaseError, @NonNull DatabaseReference databaseReference) {
          
            }
        });
    }

推荐阅读