同步、异步数据混合加载列表的技巧

状况是这样的,你的页面须要显示一个列表数据,可是数据的一部分,你能够同步的获取到,数据的另外一部你只能异步的获取到,另外,你须要根据这些数据中间插入一些分割占位,或者一些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来搞,这样也比较统一。变量

相关文章
相关标签/搜索