1、RecycleView簡介
- 是support-v7包中的新組件,是一個強大的滑動組件,與經典的ListView相比,同樣擁有item的回收復用的功能。
2、RecycleView的優點
- RecycleView 是ListView的升級版
- RecycleView封裝了ViewHolder的回收復用。
- 提供了一種插拔式的體驗,高度解耦,異常靈活。
- LinearLayoutManager : 橫向或者縱向的滑動的列表
- GridLayoutManager: 類似GridView的效果
- StaggeredGridLayoutManager: 可以實現瀑布流的效果
- 可以控制item增刪的動畫,并支持自定義動畫。
重點: 編寫Adapter
- 創建一個類,繼承RecycleView.Adapter
- 繼承三個方法:
- onCreateViewHolder() 創建視圖
- onBindViewHolder() 填充數據
- getItemCount() 獲取數據
繼承RecycleView.Adapter
- 寫Item的xml 布局
- 給Item填充數據
設置Item 的高度
- 繼承RecycleView.ItemDecoration
- 重寫getItemOffsets的方法
- 對參數outRect賦值
設置item的間距
設置間隔線
顯示多種不同的布局
- 在實體類中添加類型字段
- 復寫getItemViewType方法,返回具體類型
- 通過返回類型判斷加載不同的ViewHolder
- 填充數據
上下拉刷新操作
-
下拉刷新控件
- 使用SwipeRefreshLayout
-
設置適配器
基礎的展示適配器 在此基礎上封裝上下拉操作邏輯
public class LoadMoreWrapper extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
private RecyclerView.Adapter adapter;
// 普通布局
private final int TYPE_ITEM = 1;
// 腳布局
private final int TYPE_FOOTER = 2;
// 當前加載狀態,默認為加載完成
private int loadState = 2;
// 正在加載
public final int LOADING = 1;
// 加載完成
public final int LOADING_COMPLETE = 2;
// 加載到底
public final int LOADING_END = 3;
public LoadMoreWrapper(RecyclerView.Adapter adapter) {
this.adapter = adapter;
}
@Override
public int getItemViewType(int position) {
// 最后一個item設置為FooterView
if (position + 1 == getItemCount()) {
return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 通過判斷顯示類型,來創建不同的View
if (viewType == TYPE_FOOTER) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.layout_refresh_footer, parent, false);
return new FootViewHolder(view);
} else {
return adapter.onCreateViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof FootViewHolder) {
FootViewHolder footViewHolder = (FootViewHolder) holder;
switch (loadState) {
case LOADING: // 正在加載
footViewHolder.pbLoading.setVisibility(View.VISIBLE);
footViewHolder.tvLoading.setVisibility(View.VISIBLE);
footViewHolder.llEnd.setVisibility(View.GONE);
break;
case LOADING_COMPLETE: // 加載完成
footViewHolder.pbLoading.setVisibility(View.INVISIBLE);
footViewHolder.tvLoading.setVisibility(View.INVISIBLE);
footViewHolder.llEnd.setVisibility(View.GONE);
break;
case LOADING_END: // 加載到底
footViewHolder.pbLoading.setVisibility(View.GONE);
footViewHolder.tvLoading.setVisibility(View.GONE);
footViewHolder.llEnd.setVisibility(View.VISIBLE);
break;
default:
break;
}
} else {
adapter.onBindViewHolder(holder, position);
}
}
@Override
public int getItemCount() {
return adapter.getItemCount() + 1;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
// 如果當前是footer的位置,那么該item占據2個單元格,正常情況下占據1個單元格
return getItemViewType(position) == TYPE_FOOTER ? gridManager.getSpanCount() : 1;
}
});
}
}
private class FootViewHolder extends RecyclerView.ViewHolder {
ProgressBar pbLoading;
TextView tvLoading;
LinearLayout llEnd;
FootViewHolder(View itemView) {
super(itemView);
pbLoading = (ProgressBar) itemView.findViewById(R.id.pb_loading);
tvLoading = (TextView) itemView.findViewById(R.id.tv_loading);
llEnd = (LinearLayout) itemView.findViewById(R.id.ll_end);
}
}
/**
* 設置上拉加載狀態
*
* @param loadState 0.正在加載 1.加載完成 2.加載到底
*/
public void setLoadState(int loadState) {
this.loadState = loadState;
notifyDataSetChanged();
}
}
數據的添加、刪除、刷新、動畫
為 RecycleView添加動畫:
recycleView.setItemAnimator(new DefaultItemAnimator());增加動畫:
notifyItemInserted(position)刪除動畫:
notifyItemRemoved(position)