同步、異步數據混合加載列表的技巧

狀況是這樣的,你的頁面須要顯示一個列表數據,可是數據的一部分,你能夠同步的獲取到,數據的另外一部你只能異步的獲取到,另外,你須要根據這些數據中間插入一些分割佔位,或者一些header之類的裝飾性數據項。java

一開始處理這樣的狀況,我寫得都比較混亂,通常會在異步數據的回調裏面去處理,如今想到一個更好的寫法。異步

先假設一個更加具體的場景。
好比我有一個列表,第一部分是一段同步獲取的數據,而後第二部分是一段異步獲取的數據code

List<String> list1 = getList1();    // 同步獲取的數據

requestList2(new Callback(List<String> list2) {
    // 異步獲取的數據
});

另外,若是異步獲取的列表2存在,須要在列表1列表2之間加上一個header,做爲分割。
列表2的數量若是超過5個,就只顯示5個,而且在底部添加一個展開更多的item項。get

其實要解決這種狀況很是簡單,能夠用一個很統一的方式來處理。同步

首先咱們要將獲取的數據項存到成員變量中,而後用惟一一個方法來生成最終的列表,最後把這個列表交給adapter。it

class Activity {
    // 成員變量中須要有數據,上面兩個方法調用後,就將數據賦值過來
    List<String> mList1 = null;    
    List<String> mList2 = null;
    
    List<String> mTotalList = null;
    
    // 用這個方法來對列表進行合併,無論數據是多麼破碎,從哪裏來,同步也好,異步也好,加上一些亂七八糟的分隔header都沒問題
    private void mergeAllList() {
    
        // 先對列表進行清除
        if (mTotalList == null) {
            mTotalList = new ArrayList<>();
        } else {
            mTotalList.clear();
        }
        
        // 添加列表1的數據
        if (mList1 != null) {
            for (String s : mList1) {
                mTotalList.add(s);
            }
        }
        
        // 添加列表2的數據
        if (mList2 != null) {
            mTotalList.add("header");    // 先添加header
            
            for (int i = 0; i < mList2.size() && i < 5; i++) {
                // 最多隻添加5個
                mTotalList.add(mList2.get(i));
            }
            
            if (mList2.size() > 5) {
                mTotalList.add("展開更多");
            }
        }
    }
    
    // 用的時候
    private void updateData() {
        List<String> list1 = getList1();    // 同步獲取的數據
        mList1 = list1;
        mergeAllList();

        requestList2(new Callback(List<String> list2) {
            mList2 = list2;
            mergeAllList();
        });
    }
}

按照上面的寫法,就能夠方便的處理列表數據來源多處的狀況了。class

另外建議不要用ListView的headerView,footerView之類的東西了,那個東西太容易出問題,並且添加起來也不方便,建議新增viewType,當成數據項加入到數據中,由adapter來搞,這樣也比較統一。變量

相關文章
相關標籤/搜索