Android 4.0.3 ICS ArrayAdapter notifyDataSetChanged不更新ListView

时间:2012-09-05 10:58:33

标签: android listview android-arrayadapter

关于listviews及其适配器有很多问题,但我很确定我正确使用它。但是我现在有一个列表视图在Android 4.0.3(ICS,并且只在某些特定布局中)没有(总是)正确更新。

代码:

在活动的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:

来使用total replace示例
private void updateList() {
  runOnUiThread(new Runnable() {
    public void run() {
      mArrayAdapter.clear();
      for (CustomItem item: mLastReceivedItems) {
        mArrayAdapter.add(item);
      }
      mArrayAdapter.notifyDataSetChanged();
    }
  });
}

收到新项目时,它们会显示在列表中,但是如果收到的更新没有任何项目。当适配器真的为空时,视图仍显示项目。

代码仍可在Android 2.3.7上运行,当我使用其他布局时我也无法重现它,但我看不出可能有多重差异。

是否有人发现任何布局参数或适配器功能来解决此错误而不会失去太多性能?

1 个答案:

答案 0 :(得分:1)

我通过每次更新数据时在listview上设置相同的适配器找到了一种解决方法作为临时修复,因此listview将删除其重新使用的所有“SMART”视图:

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了,所以我们在这里失去了性能。