-
Notifications
You must be signed in to change notification settings - Fork 0
Home
慕林瑞 edited this page Dec 2, 2016
·
4 revisions
对RecyclerView的简单封装,具体能做什么?
- 封装了LayoutManager直接在xml布局中使用一个属性解决
- 封装adapter代码(减少百分之70%代码)
- 添加加载动画(一行代码轻松切换5种默认动画)(借鉴使用CymChad的动画方案)
- 添加头部(支持多个)、下拉刷新、上拉加载
- 轻松实现加载更多(是否需要更多加载逻辑已经帮你实现了哦)
- 底部显示到底了提示
- 实现Section封装,以及pinnerHeader
- 直接在数据上实现viewType的划分,不需要额外代码
- 添加拖拽item()
- 可以直接使用自定义属性改变方向,实现横向滚动或者竖向滚动,默认竖向滚动
1.1 例如竖向滚动列表:
<com.mlr.mrecyclerview.MRecyclerView
android:id="@+id/rv_common_list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
1.2 或者横向滚动列表:
<com.mlr.mrecyclerview.MRecyclerView
android:id="@+id/rv_common_list"
app:orientation="HORIZONTAL"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
2.实现普通列表只需要继承MRecyclerViewAdapter适配器并实现对应的两个个抽象方法即可
//创建一个ViewHolder
/**
* 创建itemHolder
* @param parent
* @param viewType
* @return
*/
protected abstract RecyclerView.ViewHolder createItemHolder(ViewGroup parent, int viewType);
/**
* 子类对item holder 的处理
* 此处已经去除headerview数量 子类不需要处理
*
* @param holder ViewHolder
* @param position 已经去除headerview的数量的索引
*/
protected abstract void bindItemHolder(RecyclerView.ViewHolder holder, int position, int viewType);
- 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
- 添加动画
4.1 一行代码搞定,默认提供5种方法(渐显、缩放、从下到上,从左到右、从右到左)
commonListAdapter.openLoadAnimation(MRecyclerViewAdapter.ALPHAIN);
4.2 如果没有你要的怎么办?自己自定义自己需要的动画
public class CustomAnimation implements BaseAnimation {
@Override
public Animator[] getAnimators(View view) {
return new Animator[]{
ObjectAnimator.ofFloat(view, "scaleY", 1, 1.1f, 1),
ObjectAnimator.ofFloat(view, "scaleX", 1, 1.1f, 1)
};
}
}
//同样的方法调用即可
commonListAdapter.openLoadAnimation(new CustomAnimation());
- 添加headerView
5.1 添加headerView 可以添加多个啊
View headerView1 = createHeadView("headerView1");
commonListAdapter.addHeaderView(headerView1);
View headerView2 = createHeadView("headerView2");
commonListAdapter.addHeaderView(headerView2);
5.2 将一个headerView插入到最上边
View headerView3 = createHeadView("headerView3");
commonListAdapter.addHeaderView(headerView3, 0);
5.3 移除headerView
commonListAdapter.removeHeaderView(headerView2);
- 底部显示到底了提示
//启动到底了试图
commonListAdapter.setToEndEnabled(true, rvCommonList);
- 启用加载更多
//启动加载更多 默认已经开启不需要单独设置
commonListAdapter.setHasMore(true);
//只需要实现加载更多的监听即可 是否需要加载更多的逻辑已经帮你实现了啊
commonListAdapter.setLoadMoreListener(new LoadMoreListener<AppInfo>() {
@Override
public int onLoadMoreRequested(List<AppInfo> out, int startPosition, int requestSize) {
if (count >= DataServer.MaxCount) {
LogUtils.e("mlr 没有更多数据");
} else {
LogUtils.e("mlr 请求更多数据");
out.addAll(DataServer.getCommonMoreData(requestSize));
count++;
}
return 200;
}
});
- 轻松实现网格布局
//在继承的适配器中实现这个方法 想要几个网格你说了算
@Override
public int getSpanCount() {
return 5;
}
//如果要实现混合布局这样搞就行了 根据viewType处理即可
@Override
protected int getSpanSize(int position, int viewType) {
if (viewType == DataServer.VIEW_TYPE_TITLE) {
return 5;
} else {
return super.getSpanSize(position, viewType);
}
}
- 轻松实现拖拽和滑动删除
//在继承的适配器中实现这两个方法可以针对单个item进行是否开启拖拽和滑动
@Override
public boolean isLongPressDragEnabled(int position) {
return true;
}
@Override
public boolean isItemViewSwipeEnabled(int position) {
return true;
}
- 实现Section封装,以及pinnerHeader
//Section封装实际就是混合布局啊,混合布局轻松搞定!
//PinnerHeader这样简单吧!
mRecyclerView.setSectionViewType(getSectionViewType());
mRecyclerView.setPinnedHeaderView(SectionHolder.itemView);
参考CymChad/BaseRecyclerViewAdapterHelper 的动画处理