I'm using the following method of SharedPreferences to get the index of a clicked item of a List using RecyclerView adapter , when retrieving the position from SharedPreferences it is not giving me the correct index , instead it gives another random index number, for example when I click 5 the pos value should be 4 , but I get a random number like 12 or 7 etc.
Hint: when I hover over commit , it says I can use apply instead of commit, I did that but it didn't have any effect.
How can I fix this ?
Storing data into SharedPreferences
SharedPreferences setPref = v.getContext().getSharedPreferences("PlanetAdapter", Context.MODE_PRIVATE);
setPref.edit().putInt("position", position).commit();
Retrieving data from SharedPreferences
SharedPreferences getPref = getActivity ().getSharedPreferences("PlanetAdapter", Context.MODE_PRIVATE);
int pos = getPref.getInt("position",0);
Update
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();
}
});
}
}
}
I'd say two options :
Change your PlanetViewHolder
to receive a position
public void bind(final String item, final Int position, final OnItemClickListener listener)
Then from your onBindViewHolder
you do :
vh.bind(episodeslist.get(position), position, listener);
May look like it's the same, but at least you are passing the position where you tap.
Also what you could do is add another parameter in your OnItemClickListener
with the position and in your implementation log this or print to check if that's the correct then you store it in SharedPreferences
.
public interface OnItemClickListener {
void onItemClick(String item, Int position);
}
Since you add the position in ViewHolder
you could do :
listener.onItemClick(item, position); // <-- Not the getPosition()