【问题标题】:SharedPreferences in RecyclerViewRecyclerView 中的 SharedPreferences
【发布时间】:2020-08-02 09:02:54
【问题描述】:

我是编程新手,遇到了问题。我不想用 sharedPreferences 保存整数clicks,所以我可以保存按钮的状态 mButton,但我做不到。所以也许你们可以帮助我。我知道有很多问题要问,但我真的开始绝望了。

这是我的代码。我还尝试在 RecyclerView.Adapter 类中分配共享首选项。

public class ExampleAdapter extends 
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private ArrayList<MyItem> mExampleList;
Context mContext;
SharedPreferences sharedPreferences;
private Button mButton;
private int clicks = 0;





public static class ExampleViewHolder extends RecyclerView.ViewHolder {
    private TextView mTextView;



    public ExampleViewHolder(View itemView) {

        super(itemView);
        mTextView = itemView.findViewById(R.id.tv_country);


    }

}



public ExampleAdapter(ArrayList<MyItem> exampleList, Context context) {
    mContext = context;

    mExampleList = exampleList;
}

@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        View v = 
LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item, 
parent, 
false);

        ExampleViewHolder evh = new ExampleViewHolder(v);


        mButton = v.findViewById(R.id.tv_button);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicks=clicks+1;



                int previousclicks=sharedPreferences.getInt("totalclick",0);   


                if (clicks % 2 == 0)
                    mButton.setBackgroundResource(R.drawable.button_green);
                else
                    mButton.setBackgroundResource(R.drawable.button_red);
            }
        });



    return evh;
}

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
    MyItem currentItem = mExampleList.get(position);
    holder.mTextView.setText(currentItem.getTaskText());
    sharedPreferences = 
mContext.getSharedPreferences("click_sharedpreference",Context.MODE_PRIVATE);
}

@Override
public int getItemCount() {
    return mExampleList.size();
}
}

【问题讨论】:

  • 你试过什么?什么不工作?

标签: java android sharedpreferences android-recyclerview


【解决方案1】:

首先 创建一个自定义的 sharedPreferences 类

    import android.content.Context;
    import android.content.SharedPreferences;

    public class SavePref {

        private Context context;

        public SavePref(Context context){
            this.context = context;
        }

      public static void saveInt(String key, int value) {

         SharedPreferences sharedPref = 
        PreferenceManager.getDefaultSharedPreferences(context)
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(key, value);
        editor.commit();
      }
 }

现在为您的适配器创建一个 cunstroctor:

   public static class ExampleViewHolder extends RecyclerView.ViewHolder {
      privare SavePref savePref;
      public ExampleViewHolder(SavePref savePref){ 
        this.savePref = savePref;
       }
  }

那么您可以在代码中使用savePref 将整数保存在 sharedPreferences 中

mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            clicks++;
            savePref.saveInt("clickNumber",clicks)

            if (clicks % 2 == 0) {
                mButton.setBackgroundResource(R.drawable.button_green);
            }else
                mButton.setBackgroundResource(R.drawable.button_red);
        }
    }); 

【讨论】:

  • lisne context.getDefaultSharedPreferences(Context.MODE_PRIVATE);上下文标记为红色
【解决方案2】:

您需要在 ExampleAdapter 的构造函数中为 sharedPreference 传递上下文

private mContext;
SharedPreferences sharedPreference ;
public ExampleAdapter(ArrayList<MyItem> exampleList,Context context) {
    mExampleList = exampleList;
    mContext=context;
}

onBindViewHolder 方法中创建SharedPreference

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
       MyItem currentItem = mExampleList.get(position);
       holder.mTextView.setText(currentItem.getTaskText());

sharedPreference=mContext.getSharedPreferences("click_sharedpreference",MODE_PRIVATE);   
}

在按钮的onclick中设置共享偏好的值

 mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clicks=clicks+1;


//if sharedPreference doesn't contain totalclick you will get default value 0
//if it contains then you will get the previous clicks 
//then add those clicks to current clicks

int previousclicks=sharedPreference.getInt("totalclick",0);   //default 0 click         

sharedPreference.edit().putInt("totalclick",previousclicks+clicks).commit();



if (clicks % 2 == 0) 
   mButton.setBackgroundResource(R.drawable.button_green);    
else
 mButton.setBackgroundResource(R.drawable.button_red);
}
});

【讨论】:

  • 我得到了 sharedPreferences = mContext.getSharedPreferences("click_sharedpreference",Context.MODE_PRIVATE); 的空指针异常。你知道是什么原因造成的吗
  • 我知道有很多问题要问,但你能不能复制我的代码并实现所有东西,所以我只能复制和粘贴。我真的不想失礼,但这些东西真的让我很紧张,我开始失去动力。
  • 你能告诉我你得到的确切错误吗?这样我就可以找到解决方案。
  • 我已经更新了我的答案,试试吧。它不会给出那个错误。
  • onViewBindHolder中创建sharedPreference
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-19
  • 2019-06-22
  • 2020-05-07
相关资源
最近更新 更多