Android 滚动时在recycler视图中保存SwitchCompat状态
我有一个recyclerview,它的项目包含textView和switchCompat。在同一个活动中,我还有一个文本视图,里面有一个数值。该任务是当switchCompat打开recyclerview上方的文本视图时,包含数值的文本视图应增加recyclerview项文本视图中的值。我已经这样做了,但是当在recyclerview中滚动时,switchCompat返回到默认状态,数字文本视图的值返回到原来的值 有什么帮助吗 我很抱歉现在不能发布代码的一部分,我会尽快发布,我只是现在发布了,以防以前有人通过类似的东西Android 滚动时在recycler视图中保存SwitchCompat状态,android,android-recyclerview,switchcompat,Android,Android Recyclerview,Switchcompat,我有一个recyclerview,它的项目包含textView和switchCompat。在同一个活动中,我还有一个文本视图,里面有一个数值。该任务是当switchCompat打开recyclerview上方的文本视图时,包含数值的文本视图应增加recyclerview项文本视图中的值。我已经这样做了,但是当在recyclerview中滚动时,switchCompat返回到默认状态,数字文本视图的值返回到原来的值 有什么帮助吗 我很抱歉现在不能发布代码的一部分,我会尽快发布,我只是现在发布了,以
谢谢Android中的回收器视图或任何适配器视图的关键是让适配器根据视图调整您的模型。在您的情况下,您的视图是一个TextView加上一个开关,因此您的适配器必须使某些模型适应此视图。在这种情况下,我会选择这样一个简单的模型:
class ItemModel {
String text;
boolean on;
}
为了简单起见,我省略了getter和setter
此模型包含反映文本视图中文本的字符串文本和反映开关状态的布尔值。如果为true,则检查开关,如果为false,则取消选中开关
有很多方法可以表示这个模型。我选择了这个,你可以选择另一个。关键是,您需要将状态保存到某个地方,这就是我所说的模型-视图模型
现在,让我们构建一个适配器,它可以做两件事:单击开关时更新模型,并告诉活动开关已更改状态。有一种方法可以做到这一点:
public class ItemsAdapter extends
RecyclerView.Adapter<ItemsAdapter.ViewHolder> {
@NonNull
private final List<ItemModel> itemModels;
@Nullable
private OnItemCheckedChangeListener onItemCheckedChangeListener;
ItemsAdapter(@NonNull List<ItemModel> itemModels) {
this.itemModels = itemModels;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(parent.getContext())
.inflate(R.layout.item, parent, false));
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
ItemModel item = itemModels.get(position);
holder.text.setText(item.text);
holder.switchCompat.setChecked(item.on);
// Make sure we update the model if the user taps the switch
holder.switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int adapterPosition = holder.getAdapterPosition();
ItemModel tapped = itemModels.get(adapterPosition);
itemModels.set(adapterPosition, new ItemModel(tapped.text, isChecked));
if (onItemCheckedChangeListener != null) {
onItemCheckedChangeListener.onItemCheckedChanged(adapterPosition, isChecked);
}
}
});
}
@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
super.onViewRecycled(holder);
holder.switchCompat.setOnCheckedChangeListener(null);
}
@Override
public int getItemCount() {
return itemModels.size();
}
public void setOnItemCheckedChangeListener(@Nullable OnItemCheckedChangeListener onItemCheckedChangeListener) {
this.onItemCheckedChangeListener = onItemCheckedChangeListener;
}
interface OnItemCheckedChangeListener {
/**
* Fired when the item check state is changed
*/
void onItemCheckedChanged(int position, boolean isChecked);
}
class ViewHolder extends RecyclerView.ViewHolder {
TextView text;
SwitchCompat switchCompat;
ViewHolder(View itemView) {
super(itemView);
text = itemView.findViewById(R.id.item_text);
switchCompat = itemView.findViewById(R.id.item_switch);
}
}
}
这段代码旨在演示这一想法,而不是遵循:在任何情况下,我们都会设置所有初始状态,然后设置自定义侦听器OnItemCheckedChangeListener以更新活动中的文本视图
布局文件在这里不应该是相关的,但是您可以想象,活动有一个id为count的文本视图,还有一个id为recyclerview的recycler视图
希望这有助于在将以下方法添加到适配器后,它为我解决了问题:
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}