Android ListView中的复选框在离开屏幕时被重置

Android ListView中的复选框在离开屏幕时被重置,android,android-listview,android-arrayadapter,android-checkbox,Android,Android Listview,Android Arrayadapter,Android Checkbox,我按照教程创建了一个自定义ListView,它显示带有类别标题的项目。我已经修改了list_item_entry.xml,在该项中添加了一个复选框: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layo

我按照教程创建了一个自定义ListView,它显示带有类别标题的项目。我已经修改了list_item_entry.xml,在该项中添加了一个复选框:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:paddingRight="?android:attr/scrollbarSize" >

    <CheckBox
        android:id="@+id/option_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="6dp"
        android:focusable="false"
        android:clickable="false" />

    <TextView
        android:id="@+id/list_item_entry_title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal" />

</LinearLayout>
我认为我这里有两个问题,尽管我不知道如何解决这两个问题:

每次使用vi.inflate都会导致android不断地创建视图,这是不好的,对此不确定。我试图仅在convertView==null时对其进行膨胀,但有时convertView的格式会错误,例如,当它应该是List\u item\u条目时,它是List\u item\u部分。每次充气都可以吗

我认为每次膨胀视图都会导致复选框被重置,尽管我可能错了

那么,如何使复选框在用户离开并返回屏幕时保持选中状态?如果列表足够长的话,这个方法会不会用视图填充Android的内存

更新: 我喜欢@user3815165的答案,因为我不需要为没有复选框的sectionItem存储选中的值。但正如我在一篇评论中提到的,由于items列表不在活动的上下文中,因此当视图被破坏并创建bug时,是否检查每个EntryItem的值将持续存在


所以我决定使用@Palash的答案,尽管它存储的数据并不需要列表中每个SectionItem都有一个布尔值。它工作得很好。

您需要在活动中维护一个布尔类型的状态数组,将该数组传递到列表适配器中,并且在设置该位置的复选框检查状态时,您还需要在复选框的单击事件中更新该状态数组。 试试这个,你会得到想要的输出

//While Setting the checkbox in adapter

     if(bStatus[position]==false)
        {
             itemSet.chSelectItem.setChecked(false);
        }else if(bStatus[position]==true)
            {
              itemSet.chSelectItem.setChecked(true);
            }   
在你的主要活动中

      //initilize Arraylist in main Activity
        boolean[] bStatus;
        bStatus = new boolean[BeanArray.size()];
        Arrays.fill(bStatus, false);
    MyAdapter adapter = new MyAdapter(this, BeanArray, bStatus);
listView.setAdapter(adapter);

因此,在else子句的末尾,我会有类似于checkBox.checked=savedState.getposition的内容?每次点击复选框时,我都需要更新savedState[position]?见上面的代码,你会明白,这是我的代码,可以按照你的想法来做。别忘了在点击复选框事件时更新状态数组。你可以删除if,else if,比如:itemSet.chSelect.setCheckedbStatus[position]另外,我的getView方法是在浪费内存,还是工作正常?这会产生一个bug。如果我离开活动并返回活动,我之前选中的复选框仍会被选中,但listView.GetCheckEditePositions表示未选中任何复选框。要解决此问题,我必须遍历onCreate中的项目,并对每个项目调用setOptionCheckboxfalse。据我所知,布尔值始终默认为false。初始化为false不需要toPretty确保所有值都需要初始化。但这不是问题所在。这是因为EntryItem的列表是在应用程序首次启动时创建的,然后当我导航到此活动并选中某些框时,isOptionCheckbox将设置为true。返回到第一页并再次返回到此活动,会按原意重置所有复选框,因此ListView.GetCheckEditePositions不会返回任何内容。但会选中一些复选框,因为EntryItems的isOptionValue未重置。确定。然后我也有问题:1为什么不使用单个对象而不是SectionItem和EntryItem。2为什么不能覆盖onSaveInstanceState并保留列表,以及何时重新启动此活动以恢复列表
      //initilize Arraylist in main Activity
        boolean[] bStatus;
        bStatus = new boolean[BeanArray.size()];
        Arrays.fill(bStatus, false);
    MyAdapter adapter = new MyAdapter(this, BeanArray, bStatus);
listView.setAdapter(adapter);
class Item{
 boolean isSection;
 String title;
 boolean isOptionChecbox;

 //your getter/setter

    @Override
    public String toString() {
        return title;
    }
}

you Adapter:
public class listAdapter extends ArrayAdapter<Item> {

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final Item i = items.get(position);
    if(i.isSection()){
              convertView = vi.inflate(R.layout.list_item_section, parent, false);
              convertView.setOnClickListener(null);
              convertView.setOnLongClickListener(null);
              convertView.setLongClickable(false);
              final TextView sectionView = (TextView) convertView.findViewById(R.id.list_item_section_text);
              sectionView.setText(si.getTitle());
       } else{
              convertView = vi.inflate(R.layout. list_item_entry, parent, false);
              final TextView title = (TextView) convertView.findViewById(R.id.list_item_entry_title);
              if (title != null) title.setText(ei.getTitle());

              CheckBox optionCheckbox = (CheckBox) convertView.findViewById(R.id.option_checkbox);
              optionCheckbox.setChecked(ei.isOptionCheckbox());
              optionCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                  @Override
                  public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                      item.setOptionCheckbox(b);
                  }
            });
       }      
    return convertView;
 }

}