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