Android 将选中的项目从listview保存到文件

Android 将选中的项目从listview保存到文件,android,listview,checkbox,Android,Listview,Checkbox,我在任何地方都找不到一篇文章解释如何在ListView中实际持久化复选框的结果。很多人展示了如何显示,但他们都忽略了如何保存 当我从菜单项中单击“设置收藏夹”时,我想加载一个名称列表并显示每个名称的复选框。我希望能够进行多次“检查”,然后我希望能够以某种形式将列表及其已检查的设置保存到一些持久性存储中,最好保存在SD卡上。列表只需要包含“name”的值和“isChecked”的值 我将只展示下面的结构,而不是所有的代码,因为我认为我的问题是结构和范围,而不是语法 在主菜单活动中,我将一个列表(c

我在任何地方都找不到一篇文章解释如何在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
}


}
公共类FavoriteAdapter扩展ArrayAdapter实现OnCheckedChangeListener{
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
}
@凌驾
检查更改后的公共无效(复合按钮cb,布尔值已检查){
JSONObject checked=getItem(已选择);
//这就是我被困的地方
}
}
因此,我的问题是,如果存在多个检查事件,如何持久化数据

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

如果在适配器中,它没有通知“检查”何时完成的事件,因此虽然它可以添加到模型中,但无法执行保存

如果适配器实例化了模型,那么主活动如何保存它?我可以使用什么事件来完成数据保存?back按钮方法(在主活动中定义,因此不能在适配器中操作)或activity onStop()方法,类似地

如果我在活动中实例化数据模型并将其传入,它如何再次传出以保存

正如你所看到的,我完全不知道如何处理这个问题


谢谢

我没有使用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++;
    }
}
然后单击列表外的按钮提交更改:

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

不是针对您的情况,但希望您会发现它有帮助。

我没有使用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++;
    }
}
然后单击列表外的按钮提交更改:

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

不是针对您的具体情况,但希望您会发现它对您有所帮助。

如果您只想保存SharedReference,那么保存SharedReference似乎是一个更好的选择。它也将更容易实现。我会将状态保存在任何有意义的数据类型的数组列表中,然后将其转换为json数组,并将json字符串序列化为首选项(假设它不是一个巨大的列表),我使用GSON使这变得容易得多。我只想在适配器中添加一个方法来实现这一点。通常,在活动暂停时保存数据。所以adapter.saveState()或类似的东西。如果您只想保存SharedReferences,那么保存SharedReferences似乎是一个更好的选择。它也将更容易实现。我会将状态保存在任何有意义的数据类型的数组列表中,然后将其转换为json数组,并将json字符串序列化为首选项(假设它不是一个巨大的列表),我使用GSON使这变得容易得多。我只想在适配器中添加一个方法来实现这一点。通常,在活动暂停时保存数据。所以adapter.saveState()或者类似的东西。这个答案非常接近,足以让我克服我的“日志阻塞”,这是一个不完全理解“静态”类变量和构造函数的组合-谢谢!我会在适当的时候发布我自己的代码,当我整理好的时候,很高兴我能帮上忙。。。我不确定这与使用JSON有什么关系,但看起来基本原理应该是一样的。我期待着看到你的代码,它应该教我一些新的东西。这个答案足够接近,让我克服了我的“日志堵塞”,这是一个不完全理解“静态”类变量和构造函数的组合-所以谢谢!我会在适当的时候发布我自己的代码,当我整理好的时候,很高兴我能帮上忙。。。我不确定这与使用JSON有什么关系,但看起来基本原理应该是一样的。我期待着看到你的代码,它应该教我一些新的东西。