【问题标题】:android ArrayAdapter.setNotifyOnChange(false) does not prevent listView from refreshingandroid ArrayAdapter.setNotifyOnChange(false) 不阻止listView刷新
【发布时间】:2012-06-04 12:13:45
【问题描述】:

我有一个带有数组适配器的列表视图。当我完全填写我的项目数组时,我想刷新适配器,并且仅在此时。我知道 notifyDataSetChanged() 将在 add、addAll、remove、insert 或 clear 等方法之后自动调用,但我认为我的情况可能存在错误。 这是一个应该可以工作的简单的sn-p代码。我的意思是在这种情况下,适配器不应该通知它的 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

对这个问题有什么想法吗?

【问题讨论】:

    标签: android android-arrayadapter


    【解决方案1】:

    如果您查看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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-18
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多