Android LRecyclerView
来源:互联网 发布:缅甸非法网络彩票赌博 编辑:程序博客网 时间:2024/06/04 20:10
简介
LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。
它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。
主要功能
下拉刷新、滑动到底部自动加载下页数据;
可以方便添加Header和Footer;
头部下拉样式可以自定义;
具备item点击和长按事件。
网络错误加载失败点击Footer重新请求数据;
可以动态为FooterView赋予不同状态(加载中、加载失败、滑到最底等)。
项目地址:https://github.com/jdsjlzx/LRecyclerView
本开源控件是基于 HeaderAndFooterRecyclerView 开源项目而来,在原基础上进行了扩充。在此感谢cundong作者(github地址:https://github.com/cundong)。
效果图
Gradle
Step 1. 在你的根build.gradle文件中增加JitPack仓库依赖。
allprojects{
repositories{
jcenter()
maven{url"https://jitpack.io"}
}
}
Step 2. 在你的model的build.gradle文件中增加LRecyclerView依赖。
compile'com.github.jdsjlzx:LRecyclerView:1.0.0'
使用
添加HeaderView、FooterView
mDataAdapter = newDataAdapter(this);
mDataAdapter.setData(dataList);
mHeaderAndFooterRecyclerViewAdapter = newHeaderAndFooterRecyclerViewAdapter(this,mDataAdapter);
mRecyclerView.setAdapter(mHeaderAndFooterRecyclerViewAdapter);
mRecyclerView.setLayoutManager(newLinearLayoutManager(this));
//add a HeaderView
RecyclerViewUtils.setHeaderView(mRecyclerView,newSampleHeader(this));
//add a FooterView
RecyclerViewUtils.setFooterView(mRecyclerView,newSampleFooter(this));
注意:
mHeaderAndFooterRecyclerViewAdapter = new HeaderAndFooterRecyclerViewAdapter(this, mDataAdapter);
HeaderAndFooterRecyclerViewAdapter提供了一些实用的功能,使用者不用关心它的实现,只需构造的时候把自己的mDataAdapter以参数形式传进去即可。
下拉刷新和加载更多
为了大家使用方便,将需要用的方法统一封装到接口LScrollListener中。
mRecyclerView.setLScrollListener(newLRecyclerView.LScrollListener(){
@Override
publicvoidonRefresh(){
}
@Override
publicvoidonScrollUp(){
}
@Override
publicvoidonScrollDown(){
}
@Override
publicvoidonBottom(){
}
@Override
publicvoidonScrolled(intdistanceX,intdistanceY){
}
});
LScrollListener实现了nRefresh()、onScrollUp()、onScrollDown()、onBottom()、onScrolled五个事件,如下所示:
voidonRefresh();//pull down to refresh
voidonScrollUp();//scroll down to up
voidonScrollDown();//scroll from up to down
voidonBottom();//load next page
voidonScrolled(intdistanceX,intdistanceY);// moving state,you can get the move distance
onRefresh()——RecyclerView下拉刷新事件;
onScrollUp()——RecyclerView向上滑动的监听事件;
onScrollDown()——RecyclerView向下滑动的监听事件;
onBottom()——RecyclerView滑动到底部的监听事件;
onScrollDown()——RecyclerView正在滚动的监听事件;
加载更多(加载下页数据)
从上面的LScrollListener介绍中就可以看出,实现加载更多只要在onBottom()接口中处理即可。
下拉刷新
为了达到和Listview的下拉刷新效果,本项目没有借助SwipeRefreshLayout控件,而是在自定义RecyclerView头部实现的刷新效果。
这里的下拉刷新效果借鉴了开源库:AVLoadingIndicatorView
设置加载样式:
mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);
AVLoadingIndicatorView库有多少效果,LRecyclerView就支持多少下拉刷新效果,当然你也可以自定义下拉效果。
效果图:
下拉刷新逻辑处理:
从上面的LScrollListener介绍中就可以看出,实现下拉刷新只要在onRefresh()接口中处理即可。
加载网络异常处理
加载数据时如果网络异常或者断网,LRecyclerView为你提供了重新加载的机制。
效果图:
网络异常出错代码处理如下:
RecyclerViewStateUtils.setFooterViewState(getActivity(),mRecyclerView,getPageSize(),LoadingFooter.State.NetWorkError,mFooterClick);
privateView.OnClickListenermFooterClick = newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
RecyclerViewStateUtils.setFooterViewState(getActivity(),mRecyclerView,getPageSize(),LoadingFooter.State.Loading,null);
requestData();
}
};
上面的mFooterClick就是我们点击底部的Footer时的逻辑处理事件,很显然我们还是在这里做重新请求数据操作。
点击事件和长按事件处理
在Hongyang前辈的博客中有下描述:
Click and LongClick
不过一个挺郁闷的地方就是,系统没有提供ClickListener和LongClickListener。
不过我们也可以自己去添加,只是会多了些代码而已。
实现的方式比较多,你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 当然你也可以通过adapter中自己去提供回调,这里我们选择后者,前者的方式,大家有兴趣自己去实现。
出自:http://blog.csdn.net/lmj623565791/article/details/45059587
Hongyang大神选择了后者,LRecyclerView早期选择了前者,经过实践总结,在adapter中实现点击事件会好点。
先看下怎么使用:
mHeaderAndFooterRecyclerViewAdapter.setOnItemClickLitener(newOnItemClickLitener(){
@Override
publicvoidonItemClick(Viewview,intposition){
}
@Override
publicvoidonItemLongClick(Viewview,intposition){
}
});
原理就是实现viewHolder.itemView的点击和长按事件。由于代码过多就不贴出来了。
viewHolder.itemView是RecyclerView.Adapter中本身就具有的,不用额外定义。
源码如下:
publicstaticabstractclassViewHolder{
publicfinalViewitemView;
intmPosition = NO_POSITION;
intmOldPosition = NO_POSITION;
longmItemId = NO_ID;
intmItemViewType = INVALID_TYPE;
intmPreLayoutPosition = NO_POSITION;
设置空白View(setEmptyView)
mRecyclerView.setEmptyView(view);
注意布局文件:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.cundong.recyclerview.LRecyclerView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<include
android:id="@+id/empty_view"
layout="@layout/layout_empty"
android:visibility="gone"/>
</RelativeLayout>
分享
介绍完了LRecyclerView,似乎还少些什么,对了,那就是adapter了。
为了方便大家使用,分享个封装过的adapter。
publicclassListBaseAdapter<TextendsEntity>extendsRecyclerView.Adapter{
protectedContextmContext;
protectedintmScreenWidth;
publicvoidsetScreenWidth(intwidth){
mScreenWidth = width;
}
protectedArrayList<T>mDataList = newArrayList<>();
@Override
publicRecyclerView.ViewHolder onCreateViewHolder(ViewGroupparent,intviewType){
returnnull;
}
@Override
publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){
}
@Override
publicintgetItemCount(){
returnmDataList.size();
}
publicList<T>getDataList(){
returnmDataList;
}
publicvoidsetDataList(Collection<T>list){
this.mDataList.clear();
this.mDataList.addAll(list);
notifyDataSetChanged();
}
publicvoidaddAll(Collection<T>list){
intlastIndex = this.mDataList.size();
if(this.mDataList.addAll(list)){
notifyItemRangeInserted(lastIndex,list.size());
}
}
publicvoidclear(){
mDataList.clear();
notifyDataSetChanged();
}
}
ListBaseAdapter使用了泛型,简单方便,消除了强制类型转换。
使用如下:
privateclassDataAdapterextendsListBaseAdapter<ItemModel>{
privateLayoutInflatermLayoutInflater;
publicDataAdapter(Contextcontext){
mLayoutInflater = LayoutInflater.from(context);
mContext = context;
}
@Override
publicRecyclerView.ViewHolder onCreateViewHolder(ViewGroupparent,intviewType){
returnnewViewHolder(mLayoutInflater.inflate(R.layout.sample_item_text,parent,false));
}
@Override
publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){
ItemModelitem = mDataList.get(position);
ViewHolderviewHolder = (ViewHolder)holder;
viewHolder.textView.setText(item.title);
}
privateclassViewHolderextendsRecyclerView.ViewHolder{
privateTextViewtextView;
publicViewHolder(ViewitemView){
super(itemView);
textView = (TextView)itemView.findViewById(R.id.info_text);
}
}
}
ListBaseAdapter虽然功能不强大,但是使用很方便。
结语
LRecyclerView使用方便简单,无论你添加多少Header和Footer,你都不用担心position的问题,除了方便还是方便。
最后再介绍下项目地址:https://github.com/jdsjlzx/LRecyclerView
如果觉得上面的例子UI简单,这里再分享个项目:https://github.com/jdsjlzx/Community
- Android LRecyclerView
- 浅谈Android LRecyclerView
- 浅谈Android LRecyclerView
- Android LRecyclerView实现类似viewpager的功能
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android LRecyclerView实现Item侧滑菜单、长按拖拽Item、滑动删除Item等功能
- Android LRecyclerView实现Item侧滑菜单、长按拖拽Item、滑动删除Item等功能
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多
- LRecyclerView CoordinatorLayout+CollapsingToolbarLayout 解决方案
- 进级的RecyclerView——LRecyclerView
- LRecyclerView框架 notifyDataSetChanged 图片闪烁的问题
- 进击的RecyclerView——LRecyclerView
- 进级的RecyclerView——LRecyclerView
- 解决LRecyclerView侧滑iOS阻塞效果不完整问题
- LRecyclerView(RecyclerView)下拉刷新和上拉加载
- 阅读程序,写结果2
- bat知识点3_for循环_跳出嵌套
- spider技术综述
- 在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1
- java笔试+面试总结——web篇
- Android LRecyclerView
- UIImageView 之 contentMode属性
- 移动端开发rem单位的格式化js文件flexible.js
- struct与class区别
- TOMCAT 之 startup.bat文件分析
- listview的上拉加载,下拉刷新
- Android自定义View(一)
- STL中的排序函数(模板)
- java笔试+面试总结——mysql