我按照教程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;
}
我认为,我有两个问题在这里,虽然我不知道如何解决两种:
使用
vi.inflate
每次都会导致android不断创建不好的视图(不确定这一点)。我试图只膨胀它,如果convertView == null
但有时convertView
将是错误的格式,即。List_item_section
当它应该是List_item_entry
。每次充气都可以吗?我认为每次膨胀视图导致
CheckBoxes
被重置,虽然我可能是错误的。
那么如何让CheckBoxes在离开并返回屏幕时保持检查状态?如果列表足够长,这个方法是否会将视图填充到Android的内存中?
更新: 我喜欢@ user3815165的答案,因为我并不需要存储checked
值的sectionItem
不具有一个复选框。但正如我在评论中提到,由于items
名单是不是在活动的背景下那么当视图被破坏并产生错误的每个EntryItem
是否被选中或不值仍然存在。
所以我决定去@Parash的答案,尽管它存储了不需要的数据(列表中每个SectionItem
只有一个boolean
值)。它完美的作品。
所以在'else'条款我会像 'checkBox.checked = savedState.get(位置)'结束? 每次单击复选框时,我都需要更新'savedState [position]'? – 2014-09-19 12:59:34
看到上面的代码,你会得到这个想法,它的代码和你想要的一样。 – 2014-09-19 13:01:08
并且不要忘记在复选框的单击事件中更新状态数组 – 2014-09-19 13:02:03