情况是这样的,你的页面需要显示一个列表数据,但是数据的一部分,你可以同步的获取到,数据的另一部你只能异步的获取到,另外,你需要根据这些数据中间插入一些分割占位,或者一些header之类的装饰性数据项。
一开始处理这样的情况,我写得都比较混乱,一般会在异步数据的回调里面去处理,现在想到一个更好的写法。
先假设一个更加具体的场景。
比如我有一个列表,第一部分是一段同步获取的数据,然后第二部分是一段异步获取的数据Listlist1 = getList1(); // 同步获取的数据requestList2(new Callback(List list2) { // 异步获取的数据});
另外,如果异步获取的列表2存在,需要在列表1列表2之间加上一个header,作为分割。
列表2的数量如果超过5个,就只显示5个,并且在底部添加一个展开更多的item项。其实要解决这种情况非常简单,可以用一个很统一的方式来处理。
首先我们要将获取的数据项存到成员变量中,然后用唯一一个方法来生成最终的列表,最后把这个列表交给adapter。
class Activity { // 成员变量中需要有数据,上面两个方法调用后,就将数据赋值过来 ListmList1 = null; List mList2 = null; List 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 list1 = getList1(); // 同步获取的数据 mList1 = list1; mergeAllList(); requestList2(new Callback(List list2) { mList2 = list2; mergeAllList(); }); }}
按照上面的写法,就可以方便的处理列表数据来源多处的情况了。
另外建议不要用ListView的headerView,footerView之类的东西了,那个东西太容易出问题,而且添加起来也不方便,建议新增viewType,当成数据项加入到数据中,由adapter来搞,这样也比较统一。