1. 程式人生 > >可新增Header可下拉重新整理的RecyclerView

可新增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就行了)。