让多种类型item的Recyclerview能够上拉和下拉刷新--XRefreshView
来源:互联网 发布:android ble 写数据 编辑:程序博客网 时间:2024/06/08 14:09
什么是XRefreshView
XRefreshView是一款支持任何view上拉加载和下拉刷新的库,之所以说是任何view,是因为他不仅在内部适配了Recyclerview,abslistview,scrollview,webview等view,还提供了让你自己去判断view到达顶部和底部的方法,就像这样,
refreshView.setOnTopRefreshTime(new OnTopRefreshTime() { @Override public boolean isTop() { return stickyLv.getFirstVisiblePosition() == 0; } }); refreshView.setOnBottomLoadMoreTime(new OnBottomLoadMoreTime() { @Override public boolean isBottom() { return stickyLv.getLastVisiblePosition() == mTotalItemCount - 1; } });
当isTop返回true,就会触发下拉刷新;当isBottom()返回true,就会触发上拉加载。此外还能自己定义刷新的头部和加载的底部,具体的用法可以参考github上给的demo和我之前写的博客。我会在文章末尾处贴出来。
支持多种类型的item
背景
前段时间有不少朋友都问我用XRefreshView刷新Recyclerview的时候,Recyclerview怎么支持多种类型的item,其实XRefreshView很早就支持这个功能了,但是很多人可能并不清楚怎么支持,所以我感觉有必要单独写篇博客来说明下这个问题。
效果图
能看到效果图上Recyclerview有文字在左边和文字在右边这两种布局。demo写的比较简陋,但是也能解决问题。接下来看具体操作。
步骤
RecyclerView的adapter得继承BaseRecyclerAdapter
public class MultiItemAdapter extends BaseRecyclerAdapter<MultiItemAdapter.SimpleAdapterViewHolder> { /** * 替代onBindViewHolder方法,实现这个方法就行了 */ @Override public void onBindViewHolder(SimpleAdapterViewHolder holder, int position, boolean isItem) { Person person = list.get(position); int type = getAdapterItemViewType(position); if (type == 0) { holder.tvLeft.setText(person.getName()); } else { holder.tvRight.setText(person.getName()); } } /** * 实现此方法来设置viewType */ @Override public int getAdapterItemViewType(int position) { if (list != null && list.size() > 0) { return list.get(position).getType(); } return 0; } /** * 设置Recyclerview上数据的数量,代替getAdapterCount() */ @Override public int getAdapterItemCount() { return list.size(); } /** * 用来设置headerview和footerview的viewholder的,只需要返回一个viewholder,这么写就行了 */ @Override public SimpleAdapterViewHolder getViewHolder(View view) { return new SimpleAdapterViewHolder(view, false); } public void setData(List<Person> list) { this.list = list; notifyDataSetChanged(); } /** * 替代onBindViewHolder方法,实现这个方法就行了 */ @Override public SimpleAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) { View v = null; if (viewType == 0) { v = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_left_recylerview, parent, false); } else { v = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_right_recylerview, parent, false); } return new SimpleAdapterViewHolder(v, viewType, true); } public class SimpleAdapterViewHolder extends RecyclerView.ViewHolder { public TextView tvRight, tvLeft; public SimpleAdapterViewHolder(View itemView, boolean isItem) { super(itemView); init(itemView, -1, isItem); } public SimpleAdapterViewHolder(View itemView, int viewType, boolean isItem) { super(itemView); init(itemView, viewType, isItem); } private void init(View itemView, int viewType, boolean isItem) { if (isItem) { switch (viewType) { case 0: tvLeft= (TextView) itemView.findViewById(R.id.tv_multi_left); break; default: tvRight= (TextView) itemView.findViewById(R.id.tv_multi_right); break; } } } } ...省略部分代码...}
- 先通过getAdapterItemViewType()来设置item的viewtype,设置好viewtype以后,接下来就是使用这个viewtype了;
- 在onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem)里根据viewtype创建不同布局的viewholder,并给根据viewtype给viewholder中的控件赋值;
- 最后在onBindViewHolder()中根据viewtype给不同的控件设置ui。
不过有点是需要注意的,BaseRecyclerAdapter的headerview和footerview也是有viewtype,所以在考虑viewtype值的时候,不能和headerview和footerview的viewtype冲突。
protected class VIEW_TYPES { public static final int FOOTER = -1; public static final int HEADER = -3; public static final int NORMAL = -4; }
上面就是BaseRecyclerAdapter用到的viewtype的值,注意下就行了。
其实还有很多特性,例如Recyclerview上拉加载结束以后不隐藏footerview,或者数据加载完成以后footerview显示 没有更多内容,考虑下篇博客再介绍吧。其实这些特性在github上的demo里都有写到,看看代码就能找到,如果有使用上的问题,欢迎来github上找到我。
相关博客:
打造Android万能上拉下拉刷新框架–XRefreshView(一)
打造Android万能上拉下拉刷新框架–XRefreshView(二)
打造Android万能上拉下拉刷新框架–XRefreshView(三)
由拉钩app引起的故事
github
https://github.com/huxq17/XRefreshView
预告
下篇博客是关于悬浮球的,相较于网上大多数悬浮球来说,这个悬浮球最大优点是不需要权限,具体的会在博客里说明。代码已经在github上了,点我获取源码,有需要可以先看看。
- 让多种类型item的Recyclerview能够上拉和下拉刷新--XRefreshView
- 能够下拉刷新和上拉加载的瀑布流
- RecyclerView 下拉刷新和上拉加载
- RecyclerView实现上拉刷新,下拉加载,item点击事件
- retrofit+RecyclerView+SwipeRefreshLayout下拉刷新上拉加载+item点击
- recyclerView的下拉刷新和上拉加载
- Android 实现RecyclerView的下拉刷新和上拉加载
- RecyclerView的上拉刷新,和下拉加载
- Recyclerview的下拉刷新和上拉加载
- RecyclerView的上拉加载和下拉刷新
- RecyclerView的上拉加载,下拉刷新
- Google自己的下拉刷新组件 SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- android 上拉刷新下拉加载更多的开源框架 XRefreshView
- 强大的下拉刷新上拉加载框架XRefreshView使用心得
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
- Spring+Mybatis+SpringMVC+Maven+MySql搭建实例
- unix环境高级编程-进程环境
- viewpager+fragment.一次就加载完成问题
- AVAudioPlayer后台播放
- 【转】在iOS 8中使用UIAlertController
- 让多种类型item的Recyclerview能够上拉和下拉刷新--XRefreshView
- apprtc服务器安装过程中的问题汇总1
- 普通用户下,串口永久获得权限
- 像素与照片尺寸、分辨率之间的关系
- nyoj 139 & 143 康托展开与逆展开
- C++最常用的容器之一vector类
- Redis代理twemproxy安装,配置,使用
- select、poll、epoll之间的区别总结[整理]
- C++ win7 cmd 设置无线网络连接 ip及子网掩码为固定值