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()