狀況是這樣的,你的頁面須要顯示一個列表數據,可是數據的一部分,你能夠同步的獲取到,數據的另外一部你只能異步的獲取到,另外,你須要根據這些數據中間插入一些分割佔位,或者一些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來搞,這樣也比較統一。變量