有很多关于 ListView 及其适配器的问题,但我很确定我正确使用了它。但是我现在有一个 ListView 不能(总是)在 Android 4.0.3 上正确更新(ICS,并且仅在某些特定布局中)。
代码:
在Activity的onCreate中:
mListView = (ListView) findViewById( R.id.list);
mArrayAdapter = new CustomListAdapter( this, R.layout.row_layout);
// We update it manually, but leaving this default doesn't work either
mArrayAdapter.setNotifyOnChange( false);
mListView.setAdapter( mArrayAdapter);
我从不同的线程接收到新数据,我必须在适配器中追加、替换、插入这些数据。为了简单起见,我现在使用 clear 来使用总替换示例:
private void updateList() {
runOnUiThread(new Runnable() {
public void run() {
mArrayAdapter.clear();
for (CustomItem item: mLastReceivedItems) {
mArrayAdapter.add(item);
}
mArrayAdapter.notifyDataSetChanged();
}
});
}
收到新项目时,它们会显示在列表中,但如果收到没有任何项目的更新。 View 仍在显示项目,而适配器实际上是空的。
该代码在 Android 2.3.7 上仍然有效,当我使用其他布局时我也无法重现它,但我看不到很多可能重要的差异。
有没有人找到任何布局参数或适配器函数来解决这个错误而不损失太多性能?
最佳答案
我找到了一个临时解决方法,每次更新数据时都在 ListView 上设置相同的适配器,这样 ListView 将删除其所有“SMART” View 以重新使用:
private void updateList() {
runOnUiThread(new Runnable() {
public void run() {
mArrayAdapter.clear();
for (CustomItem item: mLastReceivedItems) {
mArrayAdapter.add(item);
}
mArrayAdapter.notifyDataSetChanged();
// FIXME: Temp fix for ICS:
mListView.setAdapter( mListView.getAdapter());
}
});
}
我希望有人知道问题出在哪里,因为这样我们就不再使用 ListView.mRecycler,所以我们在这里失去了性能。
关于Android 4.0.3 ICS ArrayAdapter notifyDataSetChanged 不更新ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279934/