我有一个带有数组适配器的列表视图。当我完全填满我的项目数组时,我想刷新适配器,而且仅在此时。我知道在add、addAll、remove、insert或clear等方法之后会自动调用notifyDataSetChanged(),但我认为在我的例子中可能存在错误。下面是一个应该可以工作的简单代码片段。我的意思是,在这种情况下,适配器不应该通知它的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对这个问题有什么想法吗?
发布于 2012-10-16 16:23:26
如果查看ListView源代码,您将看到setAdapter设置了mDataChanged并调用了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();
    }https://stackoverflow.com/questions/10881093
复制相似问题