如何在列表视图中保存多个动态生成的复选框的状态? (Android Java)

时间:2016-12-18 04:26:05

标签: java android listview checkbox sharedpreferences

我有一个看起来像这样的活动 - 列表视图的长度是动态的,可以改变; enter image description here

现在,我已经根据数组的长度声明并初始化了复选框。 当用户点击" Save"时,我需要保存这些框的状态。我该如何实现这一目标?我写了下面的代码,但我没有输入,即使复选框已初始化,我也不认为活动知道哪个复选框声明是针对活动的哪个复选框。请帮忙 - 谢谢!

cbs = new CheckBox[length];
for (int i=0;i<length;i++){
        cbs[i] = new CheckBox(ThisActivity.this);
    }
btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DoOnBtnClick(v);
            }
        });
    }
    public void DoOnBtnClick (View v) {
        for(int i = 0; i < cbs.length; i++){
            if(cbs[i].isChecked()){
                selectedCheckboxes.add(toInt(cbs[i].getTag()));
                Log.e("GET TAG",Integer.toString(toInt(cbs[i].getTag())));
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您可以使用sharedPreferences来存储和检索复选框状态数据

首先初始化变量:

public static final String MyPREFERENCES = "MyPrefs";
SharedPreferences sharedPreferences;

sharedPreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

现在,在初始化所有复选框后的onCreate()中,使用setOnCheckedChangeListener

现在您可以使用以下方法从共享偏好中加载数据:

public void Load_checklist() {
    SharedPreferences shared = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
    for(int i = 0; i < cbs.length; i++){
        if (shared.getString(Integer.toString(i), "").equals("1")) {
            cbs[i].setChecked(true);
        }else{
            cbs[i].setChecked(false);
            }
    }
}

最后你的onCreate方法应如下所示:

@Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.layout_name);
      int array_length=jArray.length(); //checkbox size
      //layout where you want to dynamically add checkboxes
      LinearLayout linearLayout = (LinearLayout) findViewById(R.id.lyout);
      Load_checklist();
      for(int c=0; c<jArray.length();c++){
        CheckBox chk=new CheckBox(this);
        chk.setId(c++);
        chk.setText("Click to add values");
        chk.setTextColor(Color.GRAY);
        chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
          @Override
          public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {
           String s="x"+buttonView.getId();
           Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();

            switch(buttonView.getId()){

              case 1: // do something on 1st checkbox
                    if (isChecked) {
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        editor.putString(Integer.toString(c), "1");
                        editor.commit();
                    } else {
                        SharedPreferences.Editor editor = sharedPreferences.edit();
                        editor.putString(Integer.toString(c), "0");
                        editor.commit();
                    }
                    break;

              case 2: //do something on 2nd  checkbox
                   break;

            //And SO ON for all checkboes
        }  
       }
      });
        linearLayout.addView(chk);
      }
   }

N.B:如果SetId(Int)不起作用,那么你可以改用setTag(int)。

答案 1 :(得分:0)

如果CheckBox标记应该在列表中表示其索引,则应在实例化时设置该标记。

for (int i=0;i<length;i++){
    cbs[i] = new CheckBox(ThisActivity.this);
    cbs[i].setTag(i);
}

如果您希望由于性能影响而拥有可变数量的复选框,我不建议使用此方法。相反,请考虑使用RecyclerView以及表示复选框状态的模型对象的支持列表。

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html