Android 关于ListView中adapter调用notifyDataSetChanged无效的原因
话说这个问题已经困扰我很久了,一直找不到原因,我以为只要数据变了,调用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无效的原因的更多相关文章
- Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因
1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有 ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)
引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本 ...
- Android 实现ListView中Item被单击后背景色保持高亮
今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView.然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了.客户便有着个需求,需要单击这个Item的背景高亮 ...
- 43.Android之ListView中BaseAdapter学习
实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...
- Android 动态刷新listview中的数据
之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一 ...
- Android 关于ListView中按钮监听的优化问题(方法二)
关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...
- Android 关于ListView中按钮监听的优化问题(方法一)
在Android应用开发过程中经常会用到ListView,并且每次在item中都要对点击事件进行监听.在给按钮添加OnClickListener时,一般会下意识的在getView()中找到每一个But ...
随机推荐
- Configuration of OpenCV2.1.0 with VS2010
Add in the system Path: C:\Program Files (x86)\OpenCV-2.1.0\build\bin\Debug Project->Project Prop ...
- lightning mdb 源代码分析(5)-事务控制
本博文系列前面已经探讨了LMDB的系统架构.MMAP映射.B-Tree操作等部分,本文将尝试描述LMDB中的事务控制的实现. 事务的基本特征: 事务是恢复和并发控制的基本单位.它是一个操作序列,这些操 ...
- 一个Java方法覆盖的小问题
class SuperClass{ public SuperClass() { System.out.println("superclass "); show(); } publi ...
- OpenCV学习笔记——滑动条开关
由于opencv库中并没有专门为开关而设的函数,可以用滑动条做开关 代码: #include<highgui.h> #include<cv.h> int g_switch_va ...
- 前端编码规范(4)—— CSS 和 Sass (SCSS) 规范
CSS and Sass (SCSS) style rules ID and class naming ID和class(类)名总是使用可以反应元素目的和用途的名称,或其他通用名称.代替表象和晦涩难懂 ...
- 前端编码规范(2)—— HTML 规范
HTML 规范 文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>. (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及 ...
- DS实验题 Floyd最短路径 & Prim最小生成树
题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...
- WCF Basic Concept
http://msdn.microsoft.com/library/ee354180.aspx Steps: Designing a Service Contract Implementing a W ...
- navicat for mysql 10.1.7注册码
终于找到一个可用的了:名,组织,注册码都是:NAVN-LNXG-XHHX-5NOO 还有一个 注册码:NAVH-WK6A-DMVK-DKW3名称和组织不用填写 好像都可以用
- Machine Learning in Action -- Logistic regression
这个系列,重点关注如何实现,至于算法基础,参考Andrew的公开课 相较于线性回归,logistic回归更适合用于分类 因为他使用Sigmoid函数,因为分类的取值是0,1 对于分类,最完美和自然的函 ...