android - 如果在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
}
解决方案
首先,将您的 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) {
}
});
}
推荐阅读
- vb.net - Webview(1) 和 Edge
- python - 使用 Python lambda 函数在结果中同时获取两个值
- javascript - 如何在 Three.js 中使用 THREE.mapLinear 函数获取整数?
- python - 显示一天中时间的颜色条
- python - 转换为字符串或写入文件时对整数值的更改
- if-statement - 我根本无法输出第二行(否则如果少于 60 行)
- javascript - Google Maps API / JavaScript:如何找出自定义标记的基点/最低点以设置为锚点
- python-3.x - 使用 py2app 编译时如何修复未加载的库:@rpath/libssl.1.1.dylib?
- c# - 如何让我的 google play 应用支持更多设备?
- php - 如何在 HTML 文件中运行的 PHP 代码中隐藏电子邮件帐户密码?