1

我有一个带有数组适配器的列表视图。当我完全填写我的项目数组时,我想刷新适配器,并且仅在此时。我知道 notifyDataSetChanged() 将在 add、addAll、remove、insert 或 clear 等方法之后自动调用,但我认为我的情况可能存在错误。这是一个应该可以工作的简单代码片段。我的意思是在这种情况下,适配器不应该通知它的 ListView 并且不应该显示内容(但内容会显示在我的设备上)。

ArrayList<MenuFragmentItem> menu = buildMenu();
MenuAdapter mAdapter = new MenuAdapter(getActivity().getApplicationContext(), 0, MenuFragment.this);
mListView.setAdapter(mAdapter);
mAdapter.setNotifyOnChange(false);
mAdapter.clear();
mAdapter.addAll(menu);
//      mAdapter.notifyDataSetChanged(); SAME RESULT IF I REMOVE THIS LINE, CONTENT IS DISPLAYED

对这个问题有任何想法吗?

4

1 回答 1

0

如果您查看ListView源代码,您会看到setAdaptersetsmDataChanged和 calls requestLayout,它们将安排布局。在该布局发生之前,您的适配器不会被读回,这将在您的clear代码addAll执行之后。

http://gitorious.org/android-eeepc/base/blobs/3661101005c6527dfd384d0c88c4a3b68ee208af/core/java/android/widget/ListView.java

还有其他几种方法mDataChanged可以设置为 true 和一个新的requestLayout调用,例如检查、聚焦或选择一个项目。调用notifyDataSetChanged只是使这立即发生:

http://gitorious.org/android-eeepc/base/blobs/3661101005c6527dfd384d0c88c4a3b68ee208af/core/java/android/widget/AdapterView.java#line772

    public void onChanged() {
        mDataChanged = true;
        ...
        requestLayout();
    }
于 2012-10-16T08:23:26.073 回答