我有一个listView,并希望在按下它时展开每个项目。我有以下代码来执行此操作。我通过膨胀ViewStub来工作。
工作正常。也就是说,当我按下列表项时,它确实会膨胀。到目前为止一切都很好。
但是,我的列表很长,我注意到当我向下滚动列表时,其他项目也已经膨胀了。我不完全确定为什么。当我再次向上滚动时,我最初按下的项目已“缩小”,而其他一些项目则变得膨胀。
@override
public void onListItemClick(ListView l, View v, int position, long id) {
ListView list = getListView();
int start = list.getFirstVisiblePosition();
for (int i = start, j = list.getLastVisiblePosition(); i <= j; i++) {
Cursor item = (Cursor) list.getItemAtPosition(i);
if (id == item.getLong(item.getColumnIndex(ItemColumns._ID))) {
View view = list.getChildAt(i - start);
ViewStub stub = (ViewStub) view.findViewById(R.id.stub);
if (stub != null) {
stub.inflate();
}
}
}
}
非常感谢任何帮助!
答案 0 :(得分:1)
Android会在ListView
中重复使用观看次数。这就是convertView
getView(..)
方法Adapter
中存在Set
的原因。这篇SO帖子将解释:ListView reusing views when ... I don't want it to
基本上您需要做的是保留当前展开的getView(..)
项,并在if(mExpanded.contains(getItem(position))) {
//show expansion
} else {
//hide expansion
}
方法中进行查找:
onListItemClick
然后在您的if(!mExpanded.remove(getListView().getItem(position))) {
mExpanded.add(getListView().getItem(position));
}
方法中添加以下内容:
Set
这会导致它尝试删除该项目,如果Set
未更改 - 那么该项目不在要删除的{{1}}中,那么您要添加它...