我有一个RecycleView,我想通过共享首选项在用户存在应用程序时保存它的状态。我无法解决它4天的问题是,当我按下Toggle按钮并退出App<当重新打开它时,我发现在循环视图中的所有Togglebutton都被检查了,不仅是我检查的特定一个,反之亦然,取消选中
xml中的Togglebutton
<ToggleButton
android:gravity="start"
android:layout_width="24dp"
android:layout_height="24dp"
android:background="@drawable/check"
android:textOn=""
android:textOff=""
android:id="@+id/ToggleHeartID"
android:paddingLeft="20dp"
android:onClick="Toggle"
android:layout_margin="20dp"
android:foreground="?android:attr/selectableItemBackground"
/>
这是我的Adapter类,我在其中处理切换按钮:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
ItemClickListener mItemClickListener;
ArrayList<StoryModelM> arrayList = new ArrayList<>();
public Context context;
MyAdapter(ArrayList<StoryModelM> arrayList){
this.arrayList=arrayList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder( MyViewHolder holder, int position) {
holder.Listindex.setText(arrayList.get(position).getTitleModel());
holder.ListContent.setText(arrayList.get(position).getContentModel());
Context context =holder.itemView.getContext();
SharedPreferences sharedPreferences = context.getSharedPreferences("tgpref1",Context.MODE_PRIVATE);
boolean tgpref = sharedPreferences.getBoolean("tgpref",true);
if (tgpref){
holder.toggleButton.setChecked(true);
}else {
holder.toggleButton.setChecked(false);
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView Listindex;
TextView ListContent;
ToggleButton toggleButton;
public MyViewHolder(final View itemView) {
super(itemView);
final Context context = itemView.getContext();
Listindex =(TextView) itemView.findViewById(R.id.TextViewTitleID);
ListContent = (TextView)itemView.findViewById(R.id.TextViewContentID);
toggleButton =(ToggleButton)itemView.findViewById(R.id.ToggleHeartID);
itemView.setOnClickListener(this);
toggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (toggleButton.isChecked()) {
Animation plus = AnimationUtils.loadAnimation(v.getContext(), R.anim.pulse);
toggleButton.startAnimation(plus);
SharedPreferences sharedPreferences = context.getSharedPreferences("tgpref1", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("tgpref", true);
editor.commit();
}
else {
SharedPreferences sharedPreferences = itemView.getContext().getSharedPreferences("tgpref1", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("tgpref", false);
editor.commit();
}
}
});
}
@Override
public void onClick(View v) {
if (mItemClickListener!=null)
mItemClickListener.onItemClick(itemView, getAdapterPosition(), getItemId());
}
}
public void setFilter(ArrayList<StoryModelM> newList) {
arrayList= new ArrayList<>();
arrayList.addAll(newList);
notifyDataSetChanged();
}
public void setmItemClickListener(ItemClickListener itemClickListener ){
this.mItemClickListener= itemClickListener;
}
public interface ItemClickListener {
void onItemClick(View view, int position , long id );
}
public interface ToggleInterface {
void toggleonClick(View view);
}
@Override
public int getItemViewType(int position) {
return position;
}
}
答案 0 :(得分:0)
是的,因为您的所有行都具有SharedPreferences
:boolean tgpref = sharedPreferences.getBoolean("tgpref",true);
如果要保存每行的值,则应使用键+位置保存布尔值,如:
editor.putBoolean("tgprefAtPosition0", true);
之后,您可以获得每个位置的布尔值,如:
boolean tgpref = sharedPreferences.getBoolean("tgprefAtPosition"+ position ,true);