0

我按照教程here创建一个自定义ListView显示与类别标题项目重。我已经修改了list_item_entry.xml把一个CheckBox的项目:复选框中的ListView是当它离开屏幕

<?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> 

我的问题是,如果我查了一些CheckBoxes的滚动,然后他们关闭屏幕,当他们回来,他们都听之任之。但listView.getCheckedItemPositions()仍显示该项目是checked

我敢肯定,我的问题是与getView()方法在我的自定义ArrayAdapter

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final Item i = items.get(position); 
    if (i != null) { 
     if(i.isSection()){ 
      SectionItem si = (SectionItem)i; 
      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{ 
      EntryItem ei = (EntryItem)i; 
      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()); 
     } 
    } 
    return convertView; 
} 

我认为,我有两个问题在这里,虽然我不知道如何解决两种:

  1. 使用vi.inflate每次都会导致android不断创建不好的视图(不确定这一点)。我试图只膨胀它,如果convertView == null但有时convertView将是错误的格式,即。 List_item_section当它应该是List_item_entry。每次充气都可以吗?

  2. 我认为每次膨胀视图导致CheckBoxes被重置,虽然我可能是错误的。

那么如何让CheckBoxes在离开并返回屏幕时保持检查状态?如果列表足够长,这个方法是否会将视图填充到Android的内存中?

更新: 我喜欢@ user3815165的答案,因为我并不需要存储checked值的sectionItem不具有一个复选框。但正如我在评论中提到,由于items名单是不是在活动的背景下那么当视图被破坏并产生错误的每个EntryItem是否被选中或不值仍然存在。

所以我决定去@Parash的答案,尽管它存储了不需要的数据(列表中每个SectionItem只有一个boolean值)。它完美的作品。

回答

0

你需要保持boolean类型的状态排列在你的活动,该数组传递到你的列表中变压器并设置该位置的复选框检查状态,也需要同样更新状态阵列上点击复选框的事件。 试试这个,你会得到想要的输出。

//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); 
+0

所以在'else'条款我会像 'checkBox.checked = savedState.get(位置)'结束? 每次单击复选框时,我都需要更新'savedState [position]'? – 2014-09-19 12:59:34

+0

看到上面的代码,你会得到这个想法,它的代码和你想要的一样。 – 2014-09-19 13:01:08

+0

并且不要忘记在复选框的单击事件中更新状态数组 – 2014-09-19 13:02:03

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

} 
+0

这会产生一个错误。如果我远离活动并返回到它,那么我之前检查过的复选框仍会被检查,但是'listView.getCheckedItemPositions()'表示没有任何复选框被选中。 – 2014-09-20 03:23:18

+0

为了解决这个问题,我不得不遍历'onCreate'中的'items'并在每个''setOptionCheckbox(false)'上调用'setOptionCheckbox(false)'。 – 2014-09-20 03:33:56

+0

据我所知,布尔总是默认为false。初始化为false不需要 – user3815165 2014-09-22 07:23:52