SharedPreferences 没有给出正确的位置值?
SharedPreferences is not giving the correct position value?
我正在使用以下 SharedPreferences 方法通过 RecyclerView 适配器获取 List 中单击项目的索引,当从 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();
}
});
}
}
}
我想说两个选项:
更改您的 PlanetViewHolder
以获得职位
public void bind(final String item, final Int position, final OnItemClickListener listener)
然后从你的 onBindViewHolder
你做 :
vh.bind(episodeslist.get(位置), 位置, 监听器);
可能看起来是一样的,但至少你通过了你点击的位置。
您还可以在 OnItemClickListener
中添加另一个参数和位置,并在您的实现中记录或打印以检查是否正确,然后将其存储在 SharedPreferences
中。
public interface OnItemClickListener {
void onItemClick(String item, Int position);
}
由于您在 ViewHolder
中添加了职位,您可以这样做:
listener.onItemClick(item, position); // <-- Not the getPosition()
我正在使用以下 SharedPreferences 方法通过 RecyclerView 适配器获取 List 中单击项目的索引,当从 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();
}
});
}
}
}
我想说两个选项:
更改您的 PlanetViewHolder
以获得职位
public void bind(final String item, final Int position, final OnItemClickListener listener)
然后从你的 onBindViewHolder
你做 :
vh.bind(episodeslist.get(位置), 位置, 监听器);
可能看起来是一样的,但至少你通过了你点击的位置。
您还可以在 OnItemClickListener
中添加另一个参数和位置,并在您的实现中记录或打印以检查是否正确,然后将其存储在 SharedPreferences
中。
public interface OnItemClickListener {
void onItemClick(String item, Int position);
}
由于您在 ViewHolder
中添加了职位,您可以这样做:
listener.onItemClick(item, position); // <-- Not the getPosition()