recyclervie刷新到底部_自定义RecyclerView添加HeaderView,添加FooterView,实现滑动到底部,加载更多...
显示效果图
同步更新CSDN
PS
接触过RecyclerView的应该会有个感觉,那就是我不想在使用ListView和GridView了,因为这个控件是可以实现那两个控件(ListView和GridView)所实现的几乎所有吧,哈哈我也没用他们俩干过多少的变种哈。所以在新项目中
自然也要使用这个RecyclerView来实现效果啊。
产品要求
头部可以任意定义的,比如说Banner图轮播,各种列表显示,几种分类,然后滑动到底部(RecyclerView)显示加载更多提示,然后子线程请求数据,进行数据加载,更新UI,如果没有数据,就给一个友好的用户提示。
刚开始想法
因为这个看起来很好办的,整个放到一个ScrollView里面,这样可以实现整体可以滑动,然后监听ScrollView滑动到底部的事件,然后去请求数据,但是我自己实现过一次,效果是可以了,但是滑动起来是有阻尼的(感觉啊),滑动不过2-3个item就会停止,感觉虽然效果实现了,但是用户体验却不怎么好,(PS:还没找到为啥有阻尼,可能自己使用了一个RelativeLayout的(实现上拉加载更多监听和下拉刷新监听的自定义类吧)),有空去自己看下原因吧。
去实现
说实话,对于RecyclerView自己还是了解一些的,也写过一些简单的介绍,之前也自己实现了一个下拉加载更多的提交到的了git,大家可以去参考下。(小弟功底有限,还请多多包涵https://github.com/wuyinlei/RecycleViewRefreshDemo),那么今天这个实现的上拉加载更多也是按照这个思路去实现的,就是通过监听RecyclerView滑动到底部的方法来判断是否要显示底布局,然后去加载数据。
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//是否是最后一个显示的item位置
int lastVisiableItemPosition = manager.findLastVisibleItemPosition();
if (lastVisiableItemPosition + 1 == mCategoryAdapter.getItemCount()){
if (!isLoading){
isLoading = true; //标志位 防止重复加载数据
handler.postDelayed(new Runnable() {
@Override
public void run() {
//requestData();
requestLoadMoreData(); //请求数据
// Toast.makeText(MainActivity.this, "已经没有新的了", Toast.LENGTH_SHORT).show();
isLoading = false; //加载完成数据 更新标志位
// adapter.notifyItemRemoved(adapter.getItemCount());
}
},2000);
}
}
}
});
private void requestLoadMoreData(){
index++; //这个是模拟加载几次之后通知没有数据的
if (index <= 3) {
initData();
} else {
Toast.makeText(MainActivity.this, "已经没有新的了", Toast.LENGTH_SHORT).show();
}
// swipeRefreshLayout.setRefreshing(false);
mCategoryAdapter.notifyItemRemoved(mCategoryAdapter.getItemCount()); //加载完成之后移除footerView,也就是隐藏(去除加载中的view)
}
这样就可以很简单的实现上拉加载更多的逻辑实现了,(这个需要添加一个footerView,接下来就来分析一下如果添加FooterView,还有就是添加HeaderView)
Adapter如果写
首先定义三个变量用来说明是哪一个View,(HeaderView、View、FooterView)
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
private static final int TYPE_FOOTER = 2;
RecyclerView提供个getItemViewType(int position)方法来判断需要展示的哪种类型的View
if (mHeaderView == null) return TYPE_NORMAL;
if (position == 0) return TYPE_HEADER;
if (mHeaderView != null && position +1 == getItemCount()) return TYPE_FOOTER;
if (mHeaderView == null && position == getItemCount()) return TYPE_FOOTER;
return TYPE_NORMAL;
对于FooterView和HeaderView我们可以共用同一个ViewHolder(其实也就是使用一下,对于HeaderView的点击事件我们是在Activity或者Fragment里面去写的,后面有介绍)。这个时候我们在绑定ViewHolder的时候去判断我们需要展示的哪种View
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (mHeaderView != null && viewType == TYPE_HEADER) return new ViewHolder(mHeaderView);
if (viewType == TYPE_FOOTER) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot, parent, false);
return new FooterViewHolder(view);
}
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.category_item_layout, parent, false);
return new ViewHolder(view);
}
对于正常View的ViewHolder也是正常的写,按照之前的正常使用RecyclerView的方式。例如:
class ViewHolder extends RecyclerView.ViewHolder {
private LinearLayout mCategoryLl;
private ImageView mCategoryImg;
private TextView mCategoryTitle, mCategoryDes;
public ViewHolder(View itemView) {
super(itemView);
mCategoryImg = (ImageView) itemView.findViewById(R.id.category_book_img);
mCategoryTitle = (TextView) itemView.findViewById(R.id.category_title);
mCategoryDes = (TextView) itemView.findViewById(R.id.category_book_des);
mCategoryLl = (LinearLayout) itemView.findViewById(R.id.category_ll);
}
}
对于HeaderView,我们的处理方式(在Adapter里面进行)
public void setHeaderView(View headerView) {
mHeaderView = headerView;
notifyItemInserted(0); //位于顶部,通知一下view的第一项
}
这个时候通过在activity或者fragment里面进行
private void setHeader(RecyclerView view) {
//找到控件布局
View header = LayoutInflater.from(this).inflate(R.layout.category_item_header, view, false);
mRlBoy = (RelativeLayout) header.findViewById(R.id.rl_boy);
mRlGirl = (RelativeLayout) header.findViewById(R.id.rl_girl);
mRlEnd = (RelativeLayout) header.findViewById(R.id.rl_end);
mRlUpdate = (RelativeLayout) header.findViewById(R.id.rl_update);
mCategoryAdapter.setHeaderView(header); //设置headerview
}
HeaderView控件监听方式可以如下:
private void initListener() {
mRlBoy.setOnClickListener(this);
mRlGirl.setOnClickListener(this);
mRlEnd.setOnClickListener(this);
mRlUpdate.setOnClickListener(this);
}
基本到此为止,就能实现一般的需求了,如果有复杂的,应该还是存在其他方式的实现,以后有空或者有此需求之后自己在去研究。
解决在GridView形式下,HeaderView和FooterView只显示在最前面一个或者最后面一个(而不是占据一行bug)
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);
gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(gridLayoutManager);
// gridLayoutManager 布局管理器
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//如果是第一个(添加HeaderView) 还有就是最后一个(FooterView)
return position == mCategoryBean.size() + 1 || position == 0 ? gridLayoutManager.getSpanCount() : 1;
}
});
效果如开始哈,在次就贴下代码吧。
代码传动门:demo地址
recyclervie刷新到底部_自定义RecyclerView添加HeaderView,添加FooterView,实现滑动到底部,加载更多...相关推荐
- android 刷新某条数据_Android 支持刷新、加载更多、带反弹效果的RecyclerView
点击上方"Android技术杂货铺",选择"标星" 干货文章,第一时间送达! 开篇 当前市面上很多支持刷新.加载更多RecyclerView开源库,为何我这里还 ...
- Android使用RecyclerView实现上拉加载更多,下拉刷新,分组显示
项目地址:点击打开链接(https://github.com/MrGaoGang/luckly_recyclerview) 使用RecyclerView封装headerview,footerView, ...
- 自定义加载更多的Recycleview
自定义的加载更多的recycleView <span style="font-size:18px;">public class LoadingRecyclerView ...
- recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)
下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...
- 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多
在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...
- RecyclerView的基础使用 +点击添加列表数据 +下拉刷新、上拉加载更多
一.RecyclerView的基础使用. 第一步:添加recyclerview控件. 第二步:创建布局文件(xml) + 单独的类控制布局里面的控件(MyViewHolder). 第三步:创建一个适配 ...
- Android——RecyclerView自定义OnScrollListener实现下拉刷新监听,上拉加载更多功能
目录 [前言] 1.OnScrollListener滑动事件监听抽象类 2.利用onScrollStateChanged及onScrolled方法实现下拉刷新及上拉加载更多
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
原文地址: http://blog.csdn.net/leoleohan/article/details/50989549/ 一.概述 我们公司目前开发的所有Android APP都是遵循iOS风格设 ...
- android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多
纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...
- 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入
之前都是采用PullToRefresh进行下拉刷新和下拉加载,现在采用谷歌自己的控件SwipeFreshLayout,配合Recyclerview来实现这一效果.使用SwipeRefreshLayou ...
最新文章
- php日期时间戳相互转换,PHP时间戳和日期相互转换
- 软件Trimmomatic
- 小白视角看ros_openvino_toolkit
- sort and uniq
- word文档老是出现这个提示-----“发现二义性的名称:TmpDDE”错误
- SAP 电商云 Spartacus UI product 明细页面的路由配置
- 【项目管理】风险分析
- Android应用程序的debug属性
- 深入理解ButterKnife源码并掌握原理(一)
- linux_安装_SecureCRT下载安装登陆ubuntu配色和文件传输
- w ndows7安不上HP1020,1020打印机驱动
- 机器学习---黑箱原理
- 数独android程序,简单实现Android数独游戏
- Google Adsense通过西联快汇收取收入的详细步骤
- 小学时的游戏——24点
- OpenCV基础应用4.边缘检测
- 有关计算机病毒的说法中正确的是,以下有关计算机病毒的说法中,正确的是()。A.计算机病毒是一些人为编制的程序B.计算机病毒具有隐蔽...
- 羊了个羊3D版,迄今我见过还原度最佳游戏!还支持微信授权和教程视频
- 【渝粤题库】广东开放大学 工程施工组织与设计 形成性考核
- 怎么计算机删磁盘下游戏,永远留在硬盘里!PC玩家舍不得删除的经典单机游戏(一)...
热门文章
- Dtree 添加 checkbox 复选框 可以默认选中
- NSURLConnection实现断点续传
- Hibernate的导入和逆向工程生成JavaBean
- 如何实现ArcSDE的集群功能
- 华为STP相关功能配置
- 华为 “OSPF” 认证配置
- WLAN通信基础——WLAN物理层通信技术
- Arts 第十二周(6/3 ~ 6/9)
- 【速转身边开公司的朋友】连加油站都被比特币勒索病毒黑了!还没关闭服务器445端口的抓紧!...
- TiDB VS MariaDB10.1.19 Enterprise性能压测