2

关于列表视图及其适配器有很多问题,但我很确定我正确使用它。但是,我现在有一个列表视图,它不会(总是)在 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();
    }
  });
}

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

该代码在 Android 2.3.7 上仍然有效,当我使用其他布局时我也无法重现它,但我看不出很多重要的差异。

有没有人找到任何布局参数或适配器函数来解决这个错误而不会损失太多性能?

4

1 回答 1

1

每次更新数据时,我通过在列表视图上设置相同的适配器找到了一种临时解决方法,因此列表视图将删除其所有“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,所以我们在这里失去了性能。

于 2012-09-06T06:30:28.183 回答