情况是这样的,你的页面需要显示一个列表数据,但是数据的一部分,你可以同步的获取到,数据的另一部你只能异步的获取到,另外,你需要根据这些数据中间插入一些分割占位,或者一些header之类的装饰性数据项。

一开始处理这样的情况,我写得都比较混乱,一般会在异步数据的回调里面去处理,现在想到一个更好的写法。

先假设一个更加具体的场景。
比如我有一个列表,第一部分是一段同步获取的数据,然后第二部分是一段异步获取的数据

List<String> list1 = getList1();    // 同步获取的数据

requestList2(new Callback(List<String> list2) {
    // 异步获取的数据
});

另外,如果异步获取的列表2存在,需要在列表1列表2之间加上一个header,作为分割。
列表2的数量如果超过5个,就只显示5个,并且在底部添加一个展开更多的item项。

其实要解决这种情况非常简单,可以用一个很统一的方式来处理。

首先我们要将获取的数据项存到成员变量中,然后用唯一一个方法来生成最终的列表,最后把这个列表交给adapter。

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();
        });
    }
}

按照上面的写法,就可以方便的处理列表数据来源多处的情况了。

另外建议不要用ListView的headerView,footerView之类的东西了,那个东西太容易出问题,而且添加起来也不方便,建议新增viewType,当成数据项加入到数据中,由adapter来搞,这样也比较统一。


krosshj
152 声望16 粉丝

Developer, Gamer, Artist