JDRefresh 輕簡下拉重新整理框架

JD-CP發表於2018-06-14

JDRefresh 輕簡下拉重新整理框架

現在網上有很多 RecyclerView 相關框架,我用過的
BaseRecyclerViewAdapterHelperLRecyclerViewSmartRefreshLayout 等等
這幾個主流框架基本上都已經非常成熟,而且在github的star量也很多,有興趣的同學可以關注學習一下。

可能有人會問,既然網上有這麼多的開源框架,為什麼還寫 JDRefresh。
首先對我來說,自己擼一個框架,是一個不斷學習的過程。
而且在這個過程中,你會遇到很多之前你沒有遇見過的錯誤,
對程式碼的理解也會更深一層,是一個很好的知識技能提升的機會。
因此,心生自擼框架的想法,那麼就有了今天的主角:JDRefresh.

功能點

  • 支援設定下拉重新整理頭,上拉載入佈局
  • 支援上拉載入
  • 支援新增 HeaderView
  • 支援新增 FooterView
  • 支援自動重新整理、自動上拉載入
  • 支援多佈局
  • 支援新增 item 點選事件
  • 上拉載入失敗,支援點選重新載入
  • 側滑刪除
jdRefresh.fixedSize()
                .layoutManagerLinear()
                .dragRate(3.5f)
                .refreshEnabled(true)
                .loadMoreEnabled(true)
                .refreshHeader(refreshHeader)
                .loadMoreFooter(loadMoreFooter)
                .headerView(headerView)
                .footerView(footerView)
                .refreshListener(this)
                .loadMoreListener(this)
                .autoLoadMoreEnabled(true)
                .autoRefresh().adapter(mAdapter);
複製程式碼

是不是感覺很程式碼很清爽?那麼接下來看一下具體如何使用。

框架引入

如何使用?

  1. Add it in your root build.gradle at the end of repositories:
allprojects {
		repositories {
			...
			maven { url 'https://jitpack.io' }
		}
	}
複製程式碼
  1. Add the dependency
dependencies {
	   implementation 'com.github.JD-CP:JDRefresh:1.0.0-beta'
	}
複製程式碼

自定義下拉重新整理頭

可隨心所欲配置你想實現的下拉重新整理頭!!!

示例程式碼:

public class ExsampleRefreshHeader extends RefreshHeader {
    public ExsampleRefreshHeader(Context context) {
        super(context);
    }
    
    /**
    * 初始化 Header,具體程式碼可參考 DefaultRefreshHeader
    */
    @Override
    protected void initHeader() {
        
    }
    
    @Override
    public void stateChanged(int state) {
        
    }
    
    @Override
    public View getHeaderView() {
        return this;
    }
}

jdRefresh.setRefreshHeader(new ExsampleRefreshHeader(this));

複製程式碼

自定義上拉載入佈局

public class ExsampleLoadMoreFooter extends LoadMoreFooter {
    public ExsampleLoadMoreFooter(Context context) {
        super(context);
    }
    
    /**
    * 初始化 Header,具體程式碼可參考 DefaultRefreshHeader
    */
    @Override
    protected void initFooter() {
        
    }
    
    @Override
    public void stateChanged(int state) {
        
    }
    
    @Override
    public View getFooterView() {
        return this;
    }
}

jdRefresh.setLoadMoreFooter(new ExsampleLoadMoreFooter(this));

複製程式碼

新增 or 刪除 HeaderView、FooterView

// 新增
jdRefresh.headerView(header);
jdRefresh.footerView(footer);

// 刪除
jdRefresh.headerViewRemoved(header);
jdRefresh.footerViewRemoved(footer);
複製程式碼

設定下拉重新整理監聽器、上拉載入監聽器

// 方式 1  此種已不推薦使用,看 方式 2
jdRefresh.setRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // TODO 
            }
        });
jdRefresh.setLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void loadMore() {
                // TODO
            }
        });
 // 方式 2
 jdRefresh.refreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                // TODO 
            }
        });
jdRefresh.loadMoreListener(new OnLoadMoreListener() {
            @Override
            public void loadMore() {
                // TODO
            }
        });
複製程式碼

設定進入頁面自動重新整理

jdRefresh.autoRefresh();
複製程式碼

上拉載入

預設支援上拉載入,若禁用上拉載入,可以配置:

jdRefresh.loadMoreEnabled(false);
複製程式碼

預設支援自動上拉載入,若禁用,可以配置:

// true:開啟 false:關閉 預設為 true
jdRefresh.autoLoadMoreEnabled(boolean isAutoLoadMore);
複製程式碼

支援設定上拉載入佈局高度:

jdRefresh.loadMoreFooterHeight(int height);
複製程式碼

上拉載入完成(當前頁資料載入完成,下一頁還有資料可載入):

// 方式 1:
jdRefresh.loadMoreCompleted();
// 方式 2:
jdRefresh.noMoreData(false);
複製程式碼

上拉載入結束(沒有下一頁,也就是說下一頁無資料可載入):

jdRefresh.noMoreData(true);
複製程式碼

載入失敗配置(出現載入失敗,點選會出重新載入,無需配置點選事件):

jdRefresh.loadMoreFail();
複製程式碼

多佈局列表載入

注意:實體類必須要實現 MultiItemEntity

public class MultiSample implements MultiItemEntity {

    public static final int TYPE_NORMAL = 101;
    public static final int TYPE_OTHER = 102;

    private int type;

    public int getType() {
        return type;
    }
    
    public int setType(int type) {
        this.type = type;
    }

    @Override
    public int getItemType() {
        return type;
    }
}
複製程式碼

然後在 adapter 構造方法中,根據 type 新增相對應的 layout

public class SampleMultiAdapter extends JDMultiItemAdapter<MultiSample> {

    public SampleMultiAdapter(Context context, List<MultiSample> dataList) {
        super(context, dataList);
        addItemType(MultiSample.TYPE_NORMAL, R.layout.item_multi_normal);
        addItemType(MultiSample.TYPE_OTHER, R.layout.item_multi_other);
    }

    @Override
    protected void bind(JDViewHolder holder, MultiSample item, int position) {
        switch (item.getItemType()) {
            case MultiSample.TYPE_NORMAL:
                // 賦值操作
                break;
            case MultiSample.TYPE_OTHER:
                // 賦值操作
                break;
        }
    }
}
複製程式碼

新增 item 點選事件

// item 點選事件
mAdapter.setOnItemClickListener(new JDAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(JDAdapter adapter, View view, int position) {
                
            }
        });
        
// item child 點選事件
mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(JDAdapter adapter, View view, int position) {
                
            }
        });
複製程式碼

設定 LayoutManager

之前設定 LayoutManager 需要:

LinearLayoutManager manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
複製程式碼

現在只需:

jdRefresh.layoutManagerLinear();
複製程式碼

還有:

jdRefresh.layoutManagerLinear(orientation, reverseLayout);
jdRefresh.layoutManagerGrid(spanCount);
jdRefresh.layoutManagerGrid(spanCount, orientation, reverseLayout);
jdRefresh.layoutManagerStaggeredGrid(spanCount, orientation);
複製程式碼

側滑刪除

佈局檔案編寫:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:background="#ffffff">

    <com.jd.library.ui.SwipeDeleteMenu
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:paddingBottom="12dp"
            android:paddingLeft="15dp"
            android:paddingTop="12dp">

            <TextView
                android:layout_width="80dp"
                android:layout_height="50dp"
                android:background="#575757" />

            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingRight="10dp">

                <TextView
                    android:id="@+id/item_type"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="JDRefresh - Normal - No1"
                    android:textSize="13sp" />

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:gravity="bottom">

                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="bottom"
                        android:text="JD廠牌" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="bottom"
                        android:text="2020-08-08" />

                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

        <Button
            android:id="@+id/btnDelete"
            android:layout_width="60dp"
            android:layout_height="match_parent"
            android:background="#ff4a57"
            android:text="刪除"
            android:textColor="@android:color/white" />

    </com.jd.library.ui.SwipeDeleteMenu>

</LinearLayout>
複製程式碼

然後在 adapter 中繫結事件:

@Override
    protected void bind(JDViewHolder holder, String item, int position) {
        holder.text(R.id.item_type, item)
                .clickListener(R.id.btnDelete);
    }
複製程式碼

然後實現 itemChildClick 點選事件:

mAdapter.setOnItemChildClickListener(new JDAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(JDAdapter adapter, View view, int position) {
                adapter.removeItem(position);
            }
        });
複製程式碼

側滑刪除具體的實現過程,我已上傳到部落格。 點選下方可以進行檢視: SwipeDeleteMenu

目前 JDRefresh 已實現上述功能,接下來還會擴充更多功能,
比如置頂(仿微信),新增拖拽等等。 當然,這裡面也有諸多不足,希望各位網友提出。
這個專案也會持續不斷的維護下去。

更新記錄

  • 1.2.6-beta
    更新下拉重新整理樣式

  • 1.2.5-beta

    • HeaderView、FooterView 新增邏輯優化
    • HeaderView、FooterView 刪除功能新增
    • JDRefresh 類程式碼優化以及部分 bug 修復
  • 1.2.0-beta
    自定義仿微信看一看下拉重新整理動畫

  • 1.1.0-beta:
    增加 list item 側滑刪除。

THANKS

BaseRecyclerViewAdapterHelper
LRecyclerView
SmartRefreshLayout

聯絡方式

這裡寫圖片描述

  • 有問題可以新增我微信,我很樂意幫您解決問題,也很希望能與您一起探討學習

相關文章