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() == 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都是無效的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM