可新增Header可下拉重新整理的RecyclerView
RefreshRecyclerView
下拉重新整理的RecyclerView,兼有上拉載入更多、新增頭部、定製腳部功能,下拉重新整理使用SwipeRefreshLayout。
效果圖
用法
新增Header和Footer
Footer有預設的,就是效果圖上的那個,當然也可以使用以下方法定製Footer。
refreshView.setHeader(R.layout.header); // 添加布局作為Header
refreshView.setHeader(view); // 新增View作為Header
refreshView.setFooter(R.layout .footer); // 添加布局作為Footer
refreshView.setFooter(view); // 新增view作為Footer
重新整理和載入更多
設定監聽:
// 設定重新整理監聽
refreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
... // 可以在這裡執行資料的重新整理
}
});
// 設定載入更多監聽
refreshView.setOnLoadMoreListener(new RefreshRecycleView.OnLoadMoreListener() {
@Override
public void onLoadMore() {
... // 可以在這裡執行載入更多資料
}
});
重新整理完成後取消重新整理動畫:
refreshView.setRefreshing(false);
開啟和關閉可載入更多狀態:
refreshView.setLoadMoreEnable(false); // 不可再載入更多, 可以在沒有更多資料時使用
refreshView.setLoadMoreEnable(true); // 開啟載入更多
介面卡
RefreshRecyclerView.RefreshAdapter
是對Header、Footer等功能的支援,所以定製自己的介面卡時要繼承RefreshRecyclerView.RefreshAdapter
RecyclerView.Adapter
了。
RefreshRecyclerView.RefreshAdapter
提供了兩個抽象方法用來繫結檢視和資料:
/**
* 建立ViewHolder, 用來代替onCreateViewHolder()方法, 用法還是一樣的
*
* @param parent 父控制元件
* @param viewType 型別
* @return ViewHolder的子類例項
*/
public abstract VH onCreateHolder(ViewGroup parent, int viewType);
/**
* 給ViewHolder繫結資料, 用來代替onBindViewHolder(), 用法一樣
*
* @param holder ViewHolder的子類例項
* @param position 位置
*/
public abstract void onBindHolder(VH holder, int position);
為了支援Header和Footer,RefreshRecyclerView.RefreshAdapter
已重寫getItemViewType(int position)
方法,因此,為了不影響顯示不同型別的子檢視,RefreshRecyclerView.RefreshAdapter
還提供了以下兩個方法,有需要的話進行重寫就可以了。
/**
* 自定義獲取子檢視型別的方法
*
* @param position 位置
* @return 型別
*/
public int getItemType(int position) {
// 重寫此方法,計算並返回自己的子檢視型別
return -1;
}
/**
* 設定子檢視型別, 如果有新的子檢視型別, 直接往引數viewTypes中新增即可, 每個型別的值都要>3, 且不能重複
*
* @param viewTypes 子檢視型別列表
*/
public void setItemTypes(List<Integer> viewTypes) {
// 重寫此方法,向viewTypes中新增自己的子檢視型別,型別值必須大於3
}
除了這些方法外就是RecyclerView的方法了,如setLayoutManager(LayoutManager layout)
等。
如果以上方法不夠用,比如要設定動畫,我這裡提供的類中並沒有公開這個方法,要公開也很簡單,參考setAdapter()方法的形式就可以了。
這裡還有一個問題:就是onBindHolder(VH holder, int position)
方法的position是減去了Header的數量的(不然無法跟資料集合中的position對應),所以在使用RecyclerView的需要以position為引數的方法時,需要把Header的數量加上(這裡只能有1個Header,所以+1就行了)。