android ArrayAdapter.setNotifyOnChange(false)不会阻止listView刷新

时间:2012-06-04 12:13:46

标签: android android-arrayadapter

我有一个带有arrayadapter的listview。我想在完全填写我的项目数组时刷新适配器,并且仅在此时。我知道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

关于这个问题的任何想法?

1 个答案:

答案 0 :(得分:0)

如果查看ListView源代码,您会看到setAdapter设置mDataChanged并调用requestLayout,这将调度布局。在发生此布局之前,您的适配器将不会被回读,这将在执行clearaddAll代码之后进行回读。

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();
    }