【发布时间】:2021-06-18 08:11:37
【问题描述】:
我正在使用 SharedPreferences 的以下方法来获取使用 RecyclerView 适配器的列表的单击项的索引,当从 SharedPreferences 检索位置时,它没有给我正确的索引,而是给出了另一个随机索引号,例如 当我点击 5 时 pos 值应该是 4 ,但我得到一个随机数,如 12 或 7 等。
提示:当我将鼠标悬停在 commit 上时,它说我可以使用 apply 而不是 commit,我这样做了,但没有任何效果。
我该如何解决这个问题?
将数据存储到SharedPreferences
SharedPreferences setPref = v.getContext().getSharedPreferences("PlanetAdapter", Context.MODE_PRIVATE);
setPref.edit().putInt("position", position).commit();
从SharedPreferences检索数据
SharedPreferences getPref = getActivity ().getSharedPreferences("PlanetAdapter", Context.MODE_PRIVATE);
int pos = getPref.getInt("position",0);
更新
RecyclerView.Adapter
public class PlanetAdapter extends RecyclerView.Adapter<PlanetAdapter.PlanetViewHolder> {
public interface OnItemClickListener {
void onItemClick(String item);
}
private ArrayList<String> episodeslist;
private OnItemClickListener listener;
public PlanetAdapter(ArrayList<String> episodeslist, OnItemClickListener listener) {
this.episodeslist = episodeslist;
this.listener = listener;
}
@Override
public PlanetAdapter.PlanetViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.planet_row, parent,false);
PlanetViewHolder vh=new PlanetViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(PlanetAdapter.PlanetViewHolder vh, int position) {
TextView tv = (TextView) vh.itemView;
tv.setText(episodeslist.get(position));
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.bg, 0, 0, 0);
vh.bind(episodeslist.get(position), listener);
//holder.image.setImageResource(R.drawable.planetimage);
vh.text.setText(episodeslist.get(position).toString());
}
@Override
public int getItemCount() {
return episodeslist.size();
}
public class PlanetViewHolder extends RecyclerView.ViewHolder{
protected TextView text;
public PlanetViewHolder(View itemView) {
super(itemView);
text= (TextView) itemView.findViewById(R.id.text_id);
}
public void bind(final String item, final OnItemClickListener listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
int position = getPosition();
listener.onItemClick(item);
SharedPreferences setPref = v.getContext().getSharedPreferences("PlanetAdapter", Context.MODE_PRIVATE);
setPref.edit().putInt("position", position).commit();
}
});
}
}
}
【问题讨论】:
-
你确定你的位置是正确的吗?在将其放入
setPref之前尝试记录该位置。 -
显示您何时存储
position,发布一些适配器代码并单击监听器实现 -
谢谢,是的,我可以确认我得到了正确的位置,我仔细检查了,在发布到这里之前,我在申请
SharedPreferences之前得到了这样的值int position = getPosition();,它工作得很好好吧。 -
所以您使用
getPosition()打印的位置是您想要存储的位置,但它并没有存储该值,对吧?你能张贴你设置偏好的地方吗? -
谢谢,帖子已更新,添加了
RecyclerView.Adapter代码
标签: java android sharedpreferences