【发布时间】:2014-11-14 01:24:01
【问题描述】:
我按照教程here 创建了一个自定义ListView,它显示带有类别标题的项目。我已经修改了list_item_entry.xml,在项目中添加了CheckBox:
<?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。
我很确定我的问题在于我的自定义 ArrayAdapter 中的 getView() 方法:
@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被重置,尽管我可能对此有误。
那么我该如何做才能使复选框在离开并返回屏幕时保持选中状态?如果列表足够长,这个方法会用 Views 填充 Android 的内存吗?
更新:
我喜欢@user3815165 的答案,因为我不需要为没有复选框的sectionItem 存储checked 值。但正如我在评论中提到的,由于items 列表不在 Activity 的上下文中,因此当视图被销毁并产生错误时,是否检查每个 EntryItem 的值仍然存在。
所以我决定采用@Palash 的答案,即使它存储了不需要的数据(列表中每个SectionItem 仅有一个boolean 值)。效果很好。
【问题讨论】:
标签: android android-listview android-arrayadapter android-checkbox