1

我在任何地方都找不到一篇文章来解释如何在 ListView 中实际保留复选框的结果。很多展示如何显示,但他们都忽略了如何保存。

当我从菜单项中单击“设置收藏夹”时,我想加载一个名称列表并为每个名称显示一个复选框。我希望能够进行多次“检查”,然后我希望能够以某种形式将列表及其检查设置保存到一些持久性存储中,最好是在 SD 卡上。该列表只需要包含“name”的值和“isChecked”的值

我将只显示下面的结构,而不是所有代码,因为我认为我的问题是结构和范围之一,而不是语法

在主菜单活动中,我将一个列表(checkedlist)传递给一个自定义适配器

public class SetFavourites extends ListActivity {
 /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    .
    .
    FavouritesAdapter adapter = new FavouritesAdapter(this, checkedList);
    setListAdapter(adapter);

}

适配器有一个 onCheckedChangeListener,所以每当一个复选框被更改时,在我写 //Here's where I'm 卡住的地方,我将拥有该行的名称和检查值

public class FavouritesAdapter extends ArrayAdapter<JSONObject> implements    OnCheckedChangeListener {

@Override
 public View getView(int position, View convertView, ViewGroup parent) {

}

@Override
 public void onCheckedChanged(CompoundButton cb, boolean isChecked) {

    JSONObject checked = getItem(posSelected);

    // Here's where I'm stuck
}


}

所以我的问题是,如果有多个检查事件,我该如何保存数据?

如果我创建一个模型来保存行名称及其检查状态,那么我应该在哪里实例化该模型 - 从活动中还是从适配器中?

如果在适配器内,它没有告诉“检查”何时完成的事件,所以虽然它可以添加到模型中,但它不能进行保存。

如果Adapter实例化了模型,主Activity怎么保存呢?我可以使用什么事件来完成数据保存?后退按钮方法(在主 Activity 中定义,因此不能在 Adapter 中执行)或 Activity onStop() 方法,类似地。

如果我在Activity中实例化数据模型并传入,如何再次传出去保存?

如您所见,我完全不知道如何处理这个问题。

谢谢

4

1 回答 1

1

我没有使用过 JSON,但我在使用 SQLite 数据库时遇到了类似的情况。

所以也许我可以给你一个粗略的布局,展示我是如何处理它的,你可以填写 JSON 位并使其符合你的需要。

在自定义适配器中设置一个数组:

public static int[] checked;

有一个构造函数:

public FavouritesAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {
    super(context, layout, c, from, to);

    initializeChecked();
}

public static void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}

然后在您的 onCheckedChanged 中:

@Override
public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
    if(isChecked == true){
        checked[posSelected] = 1;
    } else {
        checked[posSelected] = 0;
    }
}

然后 onClick 用于列表外的按钮以提交您的更改:

commit.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        int i = 0;
        itemCursor.moveToFirst();  // existing cursor backing the list
        while (itemCursor.isAfterLast() == false) {  // iterate through cursor and match checked with rows
            if (FavouritesAdapter.checked[i] == 1) {
                // do your save to db/file/whatever here
        }
        i++;
        itemCursor.moveToNext();
    }
};

不特定于您的情况,但希望您会发现它有帮助。

于 2012-05-11T06:43:23.063 回答