将已检查项目从列表视图保存到文件

时间:2012-05-11 01:05:54

标签: android listview checkbox

我无法在任何地方找到解释如何在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,所以每当一个复选框改变时,在我写的地方//这就是我被卡住的地方,我将获得该行的名称和检查值

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
}


}

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

如果我创建一个模型来保存行名称及其检查状态,那么我在哪里实例化该模型 - 来自Activity,还是来自Adapter?

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

如果适配器实例化模型,主活动如何保存它?我可以用什么事件来完成数据保存?后退按钮方法(在主活动中定义,因此无法在适配器中执行)或Activity onStop()方法,类似。

如果我在Activity中实例化数据模型并将其传入,它又如何被传递出去保存?

正如你所看到的,我对如何解决这个问题感到困惑。

由于

1 个答案:

答案 0 :(得分: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;
    }
}

然后点击列表外部的按钮以提交更改:

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

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