首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓ArrayAdapter.setNotifyOnChange(false)不会阻止listView刷新

安卓ArrayAdapter.setNotifyOnChange(false)不会阻止listView刷新
EN

Stack Overflow用户
提问于 2012-06-04 20:13:46
回答 1查看 1.7K关注 0票数 1

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

代码语言:javascript
运行
复制
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

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

EN

Stack Overflow用户

发布于 2012-10-16 16:23:26

如果查看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

代码语言:javascript
运行
复制
    public void onChanged() {
        mDataChanged = true;
        ...
        requestLayout();
    }
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10881093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档