话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用adapter的notifyDataSetChanged就会更新列表,最近在做微博帐号管理这一块,想着动态更新列表,数据是变了,但就是没有把更新的数据显示出来。为什么是这样,以下是我总结的一些原因:

1、数据源没有更新,调用notifyDataSetChanged无效。

2、数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效。

3、数据源更新了,但是adpter没有收到消息通知,无法动态更新列表。

我遇到的问题的原因是第2条,数据源更新了,但它指向新的引用,这样说很抽象,拿具体例子来说吧,

我们在显示ListView数据的时候,首先需要一个数据适配器,叫做adapter的东西

1、定义两个适配器:

1个是新浪微博帐号的适配器,另一个是腾讯微博帐号的适配器

    public static AccountListAdapter sinaAccountAdapter;
public static AccountListAdapter tencentAccountAdapter;

2、定义数据源

userInfos存放的是所有帐号的数据,sinaUsers存放的是新浪帐号的数据,tencentUsers存放的是腾讯帐号的数据

    public static List<UserInfo> userInfos;
private static List<UserInfo> sinaUsers;
private static List<UserInfo> tencentUsers;
private void setListAdapter() {
// 获得新浪用户和腾讯用户的列表
getSinaUsers();
getTencentUsers();
if (userInfos.size() == ) {
Toast.makeText(mContext, "您还没有添加过账号哦", Toast.LENGTH_LONG).show();
}
sinaAccountAdapter = new AccountListAdapter(AccountManage.this,
sinaUsers);
tencentAccountAdapter = new AccountListAdapter(AccountManage.this,
tencentUsers);
accountListView.setAdapter(sinaAccountAdapter);
}

从setListAdapter这个方法中,我们可以看到,sinaAccountAdapter的数据源是sinaUsers,而tencentAccountAdapter的数据源是tencentUsers,他们分别通过getSinaUsers()、getTencentUser()方法得到

    // 获得新浪用户
private static List<UserInfo> getSinaUsers() {
sinaUsers = new ArrayList<UserInfo>();
for (UserInfo userInfo : userInfos) {
if (userInfo.getType() == SINA) {
sinaUsers.add(userInfo);
}
}
return sinaUsers;
} // 获得腾讯用户
private static List<UserInfo> getTencentUsers() {
tencentUsers = new ArrayList<UserInfo>();
for (UserInfo userInfo : userInfos) {
if (userInfo.getType() == TENCENT) {
tencentUsers.add(userInfo);
}
}
return tencentUsers;
}

我现在要定义动态更新两个帐号列表的方法

public static void updateSinaUserList() {
// 获取数据库用户列表
userInfos = dataHelper.getUserList(true);
List<UserInfo> infos = new ArrayList<UserInfo>();
for (UserInfo userInfo : userInfos) {
if (userInfo.getType() == SINA) {
infos.add(userInfo);
}
}
sinaUsers.clear();
sinaUsers.addAll(infos);
// 更新列表
sinaAccountAdapter.notifyDataSetChanged();
} public static void updateTencentUserList() {
// 获取数据库用户列表
userInfos = dataHelper.getUserList(true);
List<UserInfo> infos = new ArrayList<UserInfo>();
for (UserInfo userInfo : userInfos) {
if (userInfo.getType() == TENCENT) {
infos.add(userInfo);
}
}
tencentUsers.clear();
tencentUsers.addAll(infos);
tencentAccountAdapter.notifyDataSetChanged();
}

以上的两个方法是可以实现动态更新列表的,因为它是同一个数据源,并没有指向新的引用,我之前是直接调用getSinaUsers()和getTencentUsers()方法,这相当于重新new了一个List,并不是原来的数据源,所以无论怎么调用notifyDataSetChanged都是无效的。

Android 关于ListView中adapter调用notifyDataSetChanged无效的原因的更多相关文章

  1. Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因

    1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...

  2. Unity在Android和iOS中如何调用Native API

    本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...

  3. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)

    引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本 ...

  5. Android 实现ListView中Item被单击后背景色保持高亮

    今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...

  6. 43.Android之ListView中BaseAdapter学习

    实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...

  7. Android 动态刷新listview中的数据

    之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一 ...

  8. Android 关于ListView中按钮监听的优化问题(方法二)

    关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...

  9. Android 关于ListView中按钮监听的优化问题(方法一)

    在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...

随机推荐

  1. 怎样将文件夹打包为jar包或war包

    在dos命令中,找到要打包文件夹位置,输入jar -cvf 打包后的名和格式 文件夹名 如图: 在我的文件夹的位置就能看到jar包和war包了

  2. Ctrl+Shift+F12切换最大化编辑器

    常用快捷键(keymaps:Default情况下) Esc键编辑器(从工具窗口) F1帮助千万别按,很卡! F2(Shift+F2)下/上高亮错误或警告快速定位 F3向下查找关键字出现位置 F4查找变 ...

  3. discuz全局数组变量 后台各项设置 完整版

    $_G 保存了 Discuz! 中所有的预处理数据 缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可. Discuz! 中所有的缓存保存在 $_G[c ...

  4. java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet的解决方案

    tomcat7启动后出现:java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addServlet这个问题. 并且访问 ...

  5. 升级xcode6和ios8后,unity遇到的一些小问题

    升级最新的Xocde6后,如果不是最新版本的unity,虽然也可以也可以正常的build,但如果想通过unity连真机进行profile的话,就会在xocde中报错,这个的主要原因是unity的配置里 ...

  6. Unity中的协程(一)

    这篇文章很不错的问题,推荐阅读英文原版: Introduction to Coroutines Scripting with Coroutines   这篇文章转自:http://blog.csdn. ...

  7. PHP iconv()函数转字符编码的问题(转)

    PHP iconv()函数转字符编码的问题(转) 载自:http://www.nowamagic.net/php/php_FunctionIconv.php 在php函数库有一个函数:iconv(), ...

  8. epoll 简单介绍及例子

    第一部分:Epoll简介 . 当select()返回时,timeout参数的状态在不同的系统中是未定义的,因此每次调用select()之前必须重新初始化timeout和文件描述符set.实际上,秒,然 ...

  9. MVC程序实现Autocomplete功能

    为了加强MVC的功力,加强练习是少不了的事情.Insus.NET这次想实现文本框的autocomplete功能. 在数据创建一张表[PinYin]: 插入一些数据: INSERT INTO [dbo] ...

  10. 低功耗蓝牙4.0BLE编程-nrf51822开发(2)

    相关下载:http://download.csdn.net/detail/xgbing/9565708 首先看的示例是心率计一个示例程序:<KEIL path> \ARM\Device\N ...