【问题标题】:How to save states of multiple dynamically generated checkboxes in a list view? (Android Java)如何在列表视图中保存多个动态生成的复选框的状态? (安卓Java)
【发布时间】:2017-05-03 11:50:13
【问题描述】:

我有一个看起来像这样的 Activity - 列表视图的长度是动态的并且可以改变;

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

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())));
            }
        }
    }

【问题讨论】:

  • 当用户杀死应用程序或关闭活动时,您是否要保留复选框状态数据......?
  • 嗨,是的,我想。谢谢...请帮忙。
  • 动态创建CheckBox 的任何特殊原因?使用模型类来存储CheckBox 的状态。使用Sharedpreference 在应用退出时保存模型类数据。
  • 我是新手。请帮助我了解如何做到这一点。

标签: java android listview checkbox sharedpreferences


【解决方案1】:

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

先初始化变量:

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

sharedPreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

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

现在您可以使用以下命令从 sharedpreferences 加载数据:

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);
      }
   }

注意:如果 SetId(Int) 不起作用,那么您可以改用 setTag(int)。

【讨论】:

  • @Zac1 查看我编辑的答案,我删除了顶部的编辑器变量声明
  • 嗨,谢谢。我做了这些,但永远不会调用 onCheckedChanged 方法。我在那里输入了一个日志,并检查了 checkbox 但该循环永远不会进入。另外,你能帮我理解如何调用Load_Checlist()吗?
  • 似乎当我选择几个时,列表中的更多复选框会自动被选中...我不明白。
  • 在初始化 UI 组件后,您应该只在 onCreate() 处调用一次 load_checklist() 函数。我正在更新代码...
  • 只是总结一下:1)当我去上一个活动并回来时,未保存选中状态,2)当我选中一个框时,自动选中列表中的多个框 - 不要不知道为什么。再次感谢。
【解决方案2】:

如果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

【讨论】:

  • 我已经有很多代码,具体取决于我的列表视图。转换为 RecyclerView 有多容易?我找不到任何关于它的教程。
  • 另外,当用户退出应用程序时,如何保存所有复选框的状态?
  • 更新:由于某种原因,在单击按钮时永远不会进入 [link](if(cbs[i].isChecked()){) 循环。这是为什么?! @sean-amos
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多