JDRefresh 輕簡下拉重新整理框架
現在網上有很多 RecyclerView 相關框架,我用過的
BaseRecyclerViewAdapterHelper、
LRecyclerView、
SmartRefreshLayout 等等
這幾個主流框架基本上都已經非常成熟,而且在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);
複製程式碼
是不是感覺很程式碼很清爽?那麼接下來看一下具體如何使用。
框架引入
如何使用?
- Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
複製程式碼
- 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
聯絡方式
- 有問題可以新增我微信,我很樂意幫您解決問題,也很希望能與您一起探討學習