首页 > 解决方案 > 复选框状态未正确保存在 SharedPreference 中

问题描述

我有一个使用列表的 RecyclerViewer。在列表中有复选框。如果用户按下复选框,更新的列表将保存在 sharedPreferences 中。当我返回该活动时,这些框仍然被选中,但是当我选择新的复选框时,只有新选中的框被传递。如果我也想保存旧的复选框,我必须取消选中并重新选中它们。知道为什么吗?

下面是代码。

public class InterestActivity extends AppCompatActivity {

    private static final String TAG = "InterestActivity";
    SharedPreferences prefs;
    SharedPreferences.Editor mEditor;
    String key = "Key";

    //const
    private static final int VERIFY_PERMISSIONS_REQUEST = 1;

    //location
    private FusedLocationProviderClient fusedLocationClient;

    //Firebase
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference mRef;
    private FirebaseMethods mFirebaseMethods;
    private String userID;

    private Context mContext;


    List<Interest> lstInterest;
    StringBuffer interestList = null;
    //RecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.interest);

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
        mContext = InterestActivity.this;

        if (checkPermissionArray(Permissions.PERMISSIONS)) {

        } else {
            verifyPermissions(Permissions.PERMISSIONS);
        }
        //Firebase
        setupFirebaseAuth();


        //adapter = new RecyclerViewAdapter(this, lstInterest);


        lstInterest = new ArrayList<>();

        lstInterest.add(new Interest("BMX", R.drawable.bmx_tn, false));
        lstInterest.add(new Interest("Bowling", R.drawable.bowling_tn, false));
        lstInterest.add(new Interest("Camping", R.drawable.camping_tn, false));
        lstInterest.add(new Interest("Dance", R.drawable.dance_tn, false));
        lstInterest.add(new Interest("Fishing", R.drawable.fishing_tn, false));
        lstInterest.add(new Interest("Frisbee Golf", R.drawable.frisbeegolf_tn, false));
        lstInterest.add(new Interest("Golfing", R.drawable.golfing_tn, false));
        lstInterest.add(new Interest("Hunting", R.drawable.hunting_tn, false));
        lstInterest.add(new Interest("Kayaking", R.drawable.kayaking_tn, false));
        lstInterest.add(new Interest("Mountain Biking", R.drawable.mountainbiking_tn, false));
        lstInterest.add(new Interest("Programming", R.drawable.programming_tn, false));
        lstInterest.add(new Interest("Rock Climbing", R.drawable.rockclimbing_tn, false));
        lstInterest.add(new Interest("Skateboarding", R.drawable.skateboarding_tn, false));
        lstInterest.add(new Interest("Slack Line", R.drawable.slackline_tn, false));
        lstInterest.add(new Interest("Video Games", R.drawable.videogames_tn, false));
        lstInterest.add(new Interest("Yoga", R.drawable.yoga_tn, false));

        loadData();

        RecyclerView interestRv = (RecyclerView) findViewById(R.id.interest_recyclerview_id);
        final RecyclerViewAdapter interestAdapter = new RecyclerViewAdapter(this, lstInterest);

        interestRv.setLayoutManager(new GridLayoutManager(this, 2));
        interestRv.setAdapter(interestAdapter);


        Button btnButton = (Button) findViewById(R.id.btnInterestSave);
        btnButton.setOnClickListener(new View.OnClickListener() {


            @Override
            public void onClick(View view) {


                interestList = new StringBuffer();

                for (Interest i : interestAdapter.checkedInterest) {


                    interestList.append(i.getTitle());
                    interestList.append(",");
                    saveData();

                    Log.d(TAG, "onClick: interest adapter " + interestAdapter.checkedInterest);

                }
                if (interestAdapter.checkedInterest.size() > 0) {
                    Toast.makeText(InterestActivity.this, interestList.toString(), Toast.LENGTH_SHORT).show();

                    addUserInterest(interestList.toString());

                }

                Intent intent = new Intent(InterestActivity.this, MainActivity.class);
                startActivity(intent);
                //getUserLocation();


            }
        });


    }

    private void saveData() {
        SharedPreferences sharedPreferences = getSharedPreferences("shared preference", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(lstInterest);
        editor.putString("task list", json);
        editor.apply();
    }

    private void loadData() {


        SharedPreferences sharedPreferences = getSharedPreferences("shared preference", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("task list", null);
        Type type = new TypeToken<List<Interest>>() {
        }.getType();
        lstInterest = gson.fromJson(json, type);


    }


         /*
     `````````````````````````````````````firebase```````````````````````````````````````````````
    */

    //Send data to firebase interest DB.
    private void addUserInterest(String interest) {

        Log.d(TAG, "addUserInterest: use to save interest to database user_interest_post");


        mRef.child(mContext.getString(R.string.dbname_user_interest_post))
                .child(userID)
                .child(mContext.getString(R.string.string_interest))
                .setValue(interest);

        mRef.child("user_profile_post")
                .child(userID)
                .child("interest")
                .setValue(interest);


    }  

下面是我从 recyclerViewer 获得检查状态的地方。我相信问题出在这里。

        holder.setItemClickListener(new ItemClickListener(){
            @Override
            public void onItemClick(View v, int pos){

                CheckBox chk = (CheckBox) v;



                if (chk.isChecked()) {
                    checkedInterest.add(mData.get(pos));

                    Log.d(TAG, "onItemClick: checked state 1 " + checkedInterest);
                }else if(!chk.isChecked()){
                    checkedInterest.remove(mData.get(pos));
                    Log.d(TAG, "onItemClick: checked state 2 " + checkedInterest);
                }


                //Integer pos =  (int) holder.chk.getTag();
                //Toast.makeText(mContext, mData.get(position).getTitle() + " Clicked!", Toast.LENGTH_SHORT).show();

                if (mData.get(pos).isSelected()) {
                    mData.get(pos).setSelected(false);
                } else {
                    mData.get(pos).setSelected(true);

                }
            }
        } );

标签: javaandroidlistcheckboxsharedpreferences

解决方案


创建一个布尔值:

私人布尔检查=假;

然后在 CheckBox 中添加一个 Listener:

chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
       if (buttonView.isChecked()){
           Log.d(TAG, "button is checked!");
           checked = true; //Change boolean value 'True" because it's checked!
       }else {
           Log.d(TAG, "button is not checked!");
           checked = false; //Change boolean value 'False' because it's unchecked!
       }            
    }
});

现在您可以检查您的复选框是选中还是未选中:

if(checked){
    //condition true
}else{
    //condition false
}

如果您还想在 SharedPreferences 中保存复选框状态,只需将“ checked ”的布尔值放入SharedPref。


推荐阅读