我最终用以下方法解决了这个问题。
在我的列表适配器中,我有一个标志:
private boolean mIsSwiping;
当用户开始滑动时,我将其设置为 true,当任何滑动操作完成时(可能通过自动动画),我将其设置为 false。
在 getView() 的顶部,我检查标志的值,并在需要时提前返回。这可以防止重新绘制错误的列表视图项。
if (convertView != null && mIsSwiping) {
return convertView;
}
此外,在使用适配器的片段中,我有类似的逻辑,但将其应用于游标加载逻辑:
private Cursor mNewCursor;
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if (mListAdapter.isSwiping()) {
mNewCursor = cursor;
} else {
mListAdapter.swapCursor(cursor);
mNewCursor = null;
}
}
然后在同一个片段中,就在将 mListFragment 的 mIsSwiping 标志设置为 false 之前:
if (mNewCursor != null) {
mListFragment.swapCursor(mNewCursor);
mNewCursor = null;
}
希望这会有所帮助——它实际上只是用一些具体的代码充实了上面的 Gabe 的答案。
您可能需要单独跟踪的一件事是 mNewCursor 在换出之前是否已关闭。我自己没有遇到过这个问题,但是 YMMV。