1

我有一个 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();

            }       
        }
    }
}

任何帮助都感激不尽!

4

1 回答 1

1

Android 在ListView. 这就是为什么convertViewgetView(..)您的Adapter. 这篇 SO 帖子将解释:ListView reusing views when ... I don't want it to 基本上你需要做的是持有一个Set当前扩展的项目,并在你的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要删除的范围内,那么您想要添加它......

于 2012-07-22T19:01:09.610 回答