話說這個問題已經困擾我很久了,一直找不到原因,我以為只要數據變了,調用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() == 0) { 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都是無效的。
