RecyclerView and SharedPreference

问题描述 投票:0回答:1

晚上好!

我有一个RecyclerView,具有三个TextView,一个Checkbox和一个Cardview,我需要通过单击CardView在SharedPreference中保存状态CheckBox并更改颜色CardView和一个TextView,但是我得到一个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' on a null object reference

我的问题在哪里?

P.S。我有很多碎片,因此我需要在适配器中执行所有操作!

RecyclerView适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
   private LayoutInflater inflater;
   private List<PojoClassPrc> prc;
   Context context;

   RecyclerViewAdapter(Context context, List<PojoClassPrc> procedures) {
       this.prc = procedures;
       this.inflater = LayoutInflater.from(context);
   }

   @Override
   public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
       View view = inflater.inflate(R.layout.list_item, parent, false);
       return new ViewHolder(view);
   }

   @Override
   public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position) {
       PojoClassPrc procedures = prc.get(position);
       holder.sName1.setText(procedures.getsText1());
       holder.sName3.setText(procedures.getsText3());
       holder.sName2.setText(procedures.getsText2());
       holder.sName1.setTextColor(Color.parseColor("#010101"));
       holder.sName2.setTextColor(Color.parseColor("#ACACAC"));
       holder.sName3.setTextColor(Color.parseColor("#737373"));
   }

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

   public class ViewHolder extends RecyclerView.ViewHolder {
       final TextView sName1, sName2, sName3;
       final CheckBox sName5;
       final CardView sName4;
       ViewHolder(View view) {
           super(view);
           sName1 = (TextView) view.findViewById(R.id.lblListItem);
           sName5 = (CheckBox) view.findViewById(R.id.checkBox2);
           sName3 = (TextView) view.findViewById(R.id.lblListItem3);
           sName2 = (TextView) view.findViewById(R.id.lblListItem2);
           sName4 = (CardView) view.findViewById(R.id.item_card);

           final boolean[] clicked = {false};
           SharedPreferences prefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
           boolean cbSelect = prefs.getBoolean("sName", false);
           if (cbSelect){
               sName3.setTextColor(Color.parseColor("#178DFC"));
               sName4.setCardBackgroundColor(Color.parseColor("#C9FDFE"));
           } else {
               sName3.setTextColor(Color.parseColor("#737373"));
               sName4.setCardBackgroundColor(Color.WHITE);
           }

           sName4.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View view) {
                   if(!clicked[0]) {
                       sName5.setChecked(true);
                       sName3.setTextColor(Color.parseColor("#178DFC"));
                       sName4.setCardBackgroundColor(Color.parseColor("#C9FDFE"));
                       clicked[0] = true;
                       savePrefs(true, "sName");
                   } else {
                       sName5.setChecked(false);
                       sName3.setTextColor(Color.parseColor("#737373"));
                       sName4.setCardBackgroundColor(Color.WHITE);
                       clicked[0] = false;
                       savePrefs(false, "sName");
                   }
               }});
       }
   }

   private void savePrefs(boolean value, String name) {
       SharedPreferences.Editor editor = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE).edit();
       editor.putBoolean(name, value);
       editor.apply();
   }

   @Override
   public long getItemId(int position) {
       return position;
   }

   @Override
   public int getItemViewType(int position) {
       return position;
   }
}

更新

            final boolean clicked = false;
            SharedPreferences prefs = context.getSharedPreferences("myPrefs", Context.MODE_PRIVATE);
            boolean cbSelect = prefs.getBoolean("sName", false);
            if (cbSelect){
                sName5.setChecked(true);
                sName3.setTextColor(Color.parseColor("#178DFC"));
                sName4.setCardBackgroundColor(Color.parseColor("#C9FDFE"));
            } else {
                sName5.setChecked(false);
                sName3.setTextColor(Color.parseColor("#737373"));
                sName4.setCardBackgroundColor(Color.WHITE);
            }

            sName4.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(!clicked) {
                        sName5.setChecked(true);
                        sName3.setTextColor(Color.parseColor("#178DFC"));
                        sName4.setCardBackgroundColor(Color.parseColor("#C9FDFE"));
                        savePrefs(true, "sName");
                    } else {
                        sName5.setChecked(false);
                        sName3.setTextColor(Color.parseColor("#737373"));
                        sName4.setCardBackgroundColor(Color.WHITE);
                        savePrefs(false, "sName");
                    }
                }
            });

不起作用!

java android android-recyclerview sharedpreferences
1个回答
0
投票

上下文为空,您需要在构造函数中对其进行初始化:

RecyclerViewAdapter(Context context, List<PojoClassPrc> procedures) {
    this.context = context;
    this.prc = procedures;
    this.inflater = LayoutInflater.from(context);
}

此外,每个构造函数的初始化变量都可以是最终变量:

private final LayoutInflater inflater;
private final List<PojoClassPrc> prc;
private final Context context;
© www.soinside.com 2019 - 2024. All rights reserved.