1、RecycleView简介
- 是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item的回收复用的功能。
2、RecycleView的优点
- RecycleView 是ListView的升级版
- RecycleView封装了ViewHolder的回收复用。
- 提供了一种插拔式的体验,高度解耦,异常灵活。
- LinearLayoutManager : 横向或者纵向的滑动的列表
- GridLayoutManager: 类似GridView的效果
- StaggeredGridLayoutManager: 可以实现瀑布流的效果
- 可以控制item增删的动画,并支持自定义动画。
重点: 编写Adapter
- 创建一个类,继承RecycleView.Adapter
- 继承三个方法:
- onCreateViewHolder() 创建视图
- onBindViewHolder() 填充数据
- getItemCount() 获取数据
- 写Item的xml 布局
- 给Item填充数据
设置Item 的高度
- 继承RecycleView.ItemDecoration
- 重写getItemOffsets的方法
- 对参数outRect赋值
显示多种不同的布局
- 在实体类中添加类型字段
- 复写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)