【问题标题】:SharedPreferences is not giving the correct position value?SharedPreferences 没有给出正确的位置值?
【发布时间】: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


【解决方案1】:

我会说两个选项:

更改您的PlanetViewHolder 以获得职位

public void bind(final String item, final Int position, final OnItemClickListener listener)

然后从你的onBindViewHolder 你做:

vh.bind(episodeslist.get(position), position, listener);

可能看起来是一样的,但至少你正在通过你点击的位置。

您还可以在OnItemClickListener 中添加另一个参数,并在您的实现中记录此位置或打印以检查是否正确,然后将其存储在SharedPreferences 中。

public interface OnItemClickListener {
        void onItemClick(String item, Int position);
    }

由于您在ViewHolder 中添加了职位,您可以这样做:

listener.onItemClick(item, position); // <-- Not the getPosition()

【讨论】:

  • 我试了第一个选项还是一样。
  • 我是您的 viewHolder,您不调用 getPosition() 并使用来自 onBindViewHolder 的那个?
  • 你能不能先存入SharedPreference,然后再存入onItemClick?也许问题是你得到了旧职位......
  • 感谢您解决了这么多问题,首先存储 SharedPreference 就可以了。
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
相关资源
最近更新 更多