Android使用RecyclerView實現上拉載入更多,下拉重新整理,分組顯示
阿新 • • 發佈:2019-02-05
專案地址:點選開啟連結(https://github.com/MrGaoGang/luckly_recyclerview)
使用RecyclerView封裝headerview,footerView,並實現上拉載入更多,下拉重新整理,分組功能(新增上拉載入和下拉重新整理設定背景)
介面可能有點醜,但是是為了展示所有效果,請大家見諒。(所有東西都是可自己設定的哦)
效果圖:
如何獲取:
第一步:在專案的build.gradle中新增
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
第二步:新增依賴
dependencies {
compile 'com.github.mrgaogang:luckly_recyclerview:v2.1.1'
}
一、部分方法介紹
1、設定載入更多的監聽事件
mLRecyclerView.setLoadMoreListener(this);
並重寫onLoadMore()方法。
2、設定下拉重新整理監聽事件
mLRecyclerView.setOnRefreshListener(this);
並重寫onRefresh()方法。
3、新增分割線
已經封裝好了線性佈局的分割線和網格式佈局的分割線、流式佈局的分割線。
//線性佈局
mLRecyclerView.addLinearDivider(LRecyclerView.VERTICAL_LIST);
//網格式佈局
mLRecyclerView.addGridDivider();
//可以指定顏色和寬度
addGridDivider(int color, int dividerHeight)
addLinearDivider(int oritation, int color, int lineWidth)
4、新增錯誤檢視
當網路連線失敗等情況的時候,需要顯示錯誤檢視。
//新增錯誤的View mLRecyclerView.setErrorView(R.layout.error_view); //新增錯誤的View View error = LayoutInflater.from(this).inflate(R.layout.view_error, null, false); mLRecyclerView.setErrorView(error);
使用getErrorView()得到錯誤檢視。
5、新增空檢視
當資料為空的時候,需要顯示。
//新增空的View
mLRecyclerView.setEmptyView(R.layout.empty_view);
//新增空的View
View empty = LayoutInflater.from(this).inflate(R.layout.view_empty, null, false);
mLRecyclerView.setEmptyView(error);
使用getErrorView()得到空檢視。
6、新增headerView
//新增headerView
mLRecyclerView.addHeaderView(R.layout.header_view);
//新增headerView,需要設定父類為mLRecyclerView
View headerView = LayoutInflater.from(this).inflate(R.layout.header_view, mLRecyclerView, false);
mLRecyclerView.addHeaderView(headerView);
//得到所有headerView檢視。
List<View> getHeaderViews();
//得到所有headerView的個數。
int getHeaderViewCount();
7、設定下拉重新整理進度條的顏色和字型的顏色
//改變下方載入進度的字型顏色
mLRecyclerView.setLoadingTextColor(Color.BLUE);
//改變下方載入進度條的顏色
mLRecyclerView.setLoadingProgressColor(Color.BLUE);
//修改下拉重新整理顏色
mLRecyclerView.setRefreshColor(getResources().getColor(R.color.colorAccent));
8、設定監聽事件
//設定點選事件,注意此處返回的position是包括了headerView和下拉載入的檢視的
mLRecyclerView.setOnItemClickListener(new LucklyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(int position) {
Log.i(TAG,"點選--->"+position);
}
@Override
public void onItemLongClick(int position) {
Log.i(TAG,"長按--->"+position);
}
});
9、設定上拉載入和下拉重新整理在不同的狀態
@Override
public void onLoadMore() {
//設定處於正在載入狀態
mLRecyclerView.setLoading();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
int count = dataAdapter.getItemCount() + 1;
if (count < 50) {
List<String> strings = new ArrayList<>();
for (int i = count - 1; i < 5 + count; i++) {
strings.add("資料" + i);
}
dataAdapter.addAll(strings);
//設定資料已經載入完成狀態
mLRecyclerView.setLoadingComplete();
} else {
//設定沒有更多資料狀態,可以自定義現實的文字,上述的兩個狀態也都可以自定義文字
mLRecyclerView.setLoadingNoMore("唉呀媽呀,沒資料咯");
}
}
}, 2000);
}
@Override
public void onRefresh() {
mLRecyclerView.setRefreshEnable(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
dataAdapter.clearAll();
List<String> strings = new ArrayList<>();
for (int i = 0; i < 30; i++) {
strings.add("資料" + i);
}
dataAdapter.addAll(strings);
mLRecyclerView.setRefreshComplete();
}
}, 5000);
}
10、設定是否空白檢視和錯誤檢視點選重新整理
mLRecyclerView.setOnClickEmptyOrErrorToRefresh(true);
11、可設定下拉重新整理和上拉載入的背景圖片(可用於廣告的放置哦)
注意:
- 如果在初始化的時候 直接設定了背景圖片可不用重新整理adapter。
- 如果通過網路獲取到背景圖片之後可以使用如下方法設定背景,但是需要新增一步:notifyItemChanged()
//設定下拉重新整理的背景圖片(可放廣告圖片哦)
mLRecyclerView.setRefreshBackground(getResources().getDrawable(R.drawable.headerback));
//設定上拉載入部分設定背景圖片(也可放廣告哦)
mLRecyclerView.setFooterBackground(getResources().getDrawable(R.drawable.footerback));
//如果通過網路獲取的footer圖片,則需要呼叫以下:(如果是設定重新整理部分的背景直接呼叫setRefreshBackground)
mLRecyclerView.getOriginalRecyclerView().getAdapter()
.notifyItemChanged(mLRecyclerView.getOriginalRecyclerView().getAdapter().getItemCount() - 1);
二、如何實現分組
1、luckRecyclerView.setRecyclerViewType(LucklyRecyclerView.GROUP);
2、重寫Adapter繼承基類BaseGroupAdapter
需要重寫的幾個方法:
/**
* 第一層的數量
*
* @return
*/
public abstract int getParentCount();
/**
* 每一個parent下的child的數量
*
* @param parentPosition
* @return
*/
public abstract int getChildCountForParent(int parentPosition);
public abstract A onCreateParentViewHolder(ViewGroup parent, int viewType);
public abstract B onCreateChildViewHolder(ViewGroup parent, int viewType);
public abstract void onBindParentViewHolder(A holder, int position);
/**
* 分別是hoder,parent的位置(全域性的位置)
* child在parent中的index(不是position)
*
* @param holder
* @param parentPosition
* @param childIndexForParent
*/
public abstract void onBindChildViewHolder(B holder, int parentPosition, int childIndexForParent);
在使用點選事件的時候要注意判斷是否為Parent:
luckRecyclerView.setOnItemClickListener(new LucklyRecyclerView.OnItemClickListener() {
@Override
public void onItemClick(View rootView, int position) {
if (mGroupAdapter.isParentView(position)){
mGroupAdapter.showChild(rootView);
}else {
Toast.makeText(getApplicationContext(),"點選了第"+mGroupAdapter.getParentIndexFromChild(position)+"個parent的"+mGroupAdapter.getChildIndexForParent(position),Toast.LENGTH_SHORT).show();
}
}
@Override
public void onItemLongClick(View rootView, int position) {
}
});
3、常用的幾個方法
1、獲取child在parent下的index
mGroupAdapter.getChildIndexForParent(position);
2、獲取parent的index
mGroupAdapter.getParentIndexFromChild(position);
3、判斷當前position是否為parentView
mGroupAdapter.isParentView(position);
三、具體如何使用請看例子
歡迎關注我的微信公眾號: