【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
转载请标明出处:
http://blog.csdn.net/developer_jiangqq/article/details/49992269
本文出自:【江清清的博客】
(一).前言:
【好消息】个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org
话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制。前三三篇文章已经贡呢更新了以下三个部分:
- RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类(点击进入)
- RecyclerView控件的实战实例(点击进入)
- RecyclerView控件集合AA(Android Annotations)注入框架实例(点击进入)
本来这个专题不打算更新,不过前两天看到各位童鞋还是挺积极的评论到,希望可以更新RecyclerView加入下拉刷新和上拉加载更多的功能。正好昨天周末,所以我这边也就实现了这样的功能,今天更新一下。具体代码已经上传到下面的项目中,欢迎各位去star和fork一下。
FastDev4Android框架项目地址:https://github.com/jiangqqlmj/FastDev4Android
RecyclerView实现的列表,默认情况下面是不带下拉刷新和上拉记载更多效果的,但是我在我们的实际项目当中,为了提高用户体验,这种效果一般都需要实现,在我以前的博客中已经重写了ListView(Android 列表下拉刷新组件PullToRefreshListView使用)实现上拉刷新和上拉加载更多效果。现在我们已经学会了ListView,GridView的替代品RecyclerView的基本使用方法,那么必不可少的也需要实现上拉刷新和上拉加载更多的效果了。今天我们会通过两种方式来实现,具体会采用Android的另一控件SwipeRefreshLayout。
(二).SwipeRefreshLayout介绍:
SwipeRefrshLayout是Google官方更新的一个Widget,可以实现下拉刷新的效果。该控件集成自ViewGroup在support-v4兼容包下,不过我们需要升级supportlibrary的版本到19.1以上。基本使用的方法如下:
- setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器
- setRefreshing(boolean):显示或者隐藏刷新进度条
- isRefreshing():检查是否处于刷新状态
- setColorSchemeResources():设置进度条的颜色主题,最多设置四种,以前的setColorScheme()方法已经弃用了。
具体使用效果下面我们会看到。
(三).RecyclerView+SwpieRefreshLayout实现下拉刷新效果:
1.SwipeRefreshLayout本身自带下拉刷新的效果,那么我们可以选择在RecyclerView布局外部嵌套一层SwipeRefreshLayout布局即可,具体布局文件如下:
- <?xmlversionxmlversion="1.0" encoding="utf-8"?>
- <LinearLayoutxmlns:androidLinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"android:layout_width="match_parent"
- android:layout_height="match_parent">
- <includelayoutincludelayout="@layout/common_top_bar_layout"/>
- <android.support.v4.widget.SwipeRefreshLayout
- android:id="@+id/demo_swiperefreshlayout"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:scrollbars="vertical"
- >
- <android.support.v7.widget.RecyclerView
- android:id="@+id/demo_recycler"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- ></android.support.v7.widget.RecyclerView>
- </android.support.v4.widget.SwipeRefreshLayout>
- </LinearLayout>
2.接着在Activity中获取SwipeRefreshLayout控件并且设置OnRefreshListener监听器,同时实现里边的onRefresh()方法,在该方法中进行网络请求最新数据,然后刷新RecyclerView列表同时设置SwipeRefreshLayout的进度Bar的隐藏或者显示效果。具体代码如下:
- demo_swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- Log.d("zttjiangqq","invoke onRefresh...");
- new Handler().postDelayed(newRunnable() {
- @Override
- public void run() {
- List<String> newDatas = new ArrayList<String>();
- for (int i = 0; i <5; i++) {
- int index = i + 1;
- newDatas.add("new item" + index);
- }
- adapter.addItem(newDatas);
- demo_swiperefreshlayout.setRefreshing(false);
- Toast.makeText(RecyclerRefreshActivity.this, "更新了五条数据...", Toast.LENGTH_SHORT).show();
- }
- }, 5000);
- }
- });
3.除此之外我们也来看一下Adapter和Activity中的其他代码,也方便各位童鞋查看。
- RecyclerRefreshActivity.java
- public class RecyclerRefreshActivity extends BaseActivity {
- private LinearLayout top_bar_linear_back;
- private TextView top_bar_title;
- private SwipeRefreshLayout demo_swiperefreshlayout;
- private RecyclerView demo_recycler;
- private RefreshRecyclerAdapter adapter;
- private LinearLayoutManager linearLayoutManager;
- private int lastVisibleItem;
- @Override
- protected void onCreate(BundlesavedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.recycler_refresh_layout);
- top_bar_linear_back=(LinearLayout)this.findViewById(R.id.top_bar_linear_back);
- top_bar_linear_back.setOnClickListener(new CustomOnClickListener());
- top_bar_title=(TextView)this.findViewById(R.id.top_bar_title);
- top_bar_title.setText("RecyclerView下拉刷新,下拉加载更多...");
- demo_swiperefreshlayout=(SwipeRefreshLayout)this.findViewById(R.id.demo_swiperefreshlayout);
- demo_recycler=(RecyclerView)this.findViewById(R.id.demo_recycler);
- //设置刷新时动画的颜色,可以设置4个
- demo_swiperefreshlayout.setProgressBackgroundColorSchemeResource(android.R.color.white);
- demo_swiperefreshlayout.setColorSchemeResources(android.R.color.holo_blue_light,
- android.R.color.holo_red_light,android.R.color.holo_orange_light,
- android.R.color.holo_green_light);
- demo_swiperefreshlayout.setProgressViewOffset(false, 0, (int) TypedValue
- .applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources()
- .getDisplayMetrics()));
- linearLayoutManager=new LinearLayoutManager(this);
- linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);
- demo_recycler.setLayoutManager(linearLayoutManager);
- //添加分隔线
- demo_recycler.addItemDecoration(new AdvanceDecoration(this, OrientationHelper.VERTICAL));
- demo_recycler.setAdapter(adapter = new RefreshRecyclerAdapter(this));
- demo_swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- Log.d("zttjiangqq","invoke onRefresh...");
- new Handler().postDelayed(newRunnable() {
- @Override
- public void run() {
- List<String> newDatas = new ArrayList<String>();
- for (int i = 0; i <5; i++) {
- int index = i + 1;
- newDatas.add("new item" + index);
- }
- adapter.addItem(newDatas);
- demo_swiperefreshlayout.setRefreshing(false);
- Toast.makeText(RecyclerRefreshActivity.this, "更新了五条数据...", Toast.LENGTH_SHORT).show();
- }
- }, 5000);
- }
- });
- class CustomOnClickListenerimplements View.OnClickListener{
- @Override
- public void onClick(View v) {
- RecyclerRefreshActivity.this.finish();
- }
- }
- }
- RefreshRecyclerAdapter.java
- public class RefreshRecyclerAdapter extends RecyclerView.Adapter<RefreshRecyclerAdapter.ViewHolder>{
- private LayoutInflater mInflater;
- private List<String> mTitles=null;
- public RefreshRecyclerAdapter(Context context){
- this.mInflater=LayoutInflater.from(context);
- this.mTitles=new ArrayList<String>();
- for (int i=0;i<20;i++){
- int index=i+1;
- mTitles.add("item"+index);
- }
- }
- /**
- * item显示类型
- * @param parent
- * @param viewType
- * @return
- */
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- final Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
- //这边可以做一些属性设置,甚至事件监听绑定
- //view.setBackgroundColor(Color.RED);
- ViewHolder viewHolder=new ViewHolder(view);
- return viewHolder;
- }
- /**
- * 数据的绑定显示
- * @param holder
- * @param position
- */
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- holder.item_tv.setText(mTitles.get(position));
- holder.itemView.setTag(position);
- }
- @Override
- public int getItemCount() {
- return mTitles.size();
- }
- //自定义的ViewHolder,持有每个Item的的所有界面元素
- public static class ViewHolder extends RecyclerView.ViewHolder {
- public TextView item_tv;
- public ViewHolder(View view){
- super(view);
- item_tv = (TextView)view.findViewById(R.id.item_tv);
- }
- }
- //添加数据
- public void addItem(List<String> newDatas) {
- //mTitles.add(position, data);
- //notifyItemInserted(position);
- newDatas.addAll(mTitles);
- mTitles.removeAll(mTitles);
- mTitles.addAll(newDatas);
- notifyDataSetChanged();
- }
- public void addMoreItem(List<String> newDatas) {
- mTitles.addAll(newDatas);
- notifyDataSetChanged();
- }
- }
以上重要地方的注释已经加上去了。
5.运行效果如下:
(四).RecyclerView设置滚动事件加入上拉加载更多功能
下面我们再来看RecyclerView和相关类的一些特性,
LayoutManger给我们提供了以下几个方法来让开发者方便的获取到屏幕上面的顶部item和顶部item相关的信息:
- findFirstVisibleItemPosition()
- findFirstCompletlyVisibleItemPosition()
- findLastVisibleItemPosition()
- findLastCompletlyVisibleItemPosition()
同时通过Recycler.Adapter的getItemCount()方法可以轻松获取到RecyclerView列表中Item View的个数。
那么下面我们通过监听滑动(滚动)事件,然后在里边判断是否已经滑动到最底部来加载更多的数据,使用方法如下:
- //RecyclerView滑动监听
- demo_recycler.setOnScrollListener(new RecyclerView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- if (newState ==RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 ==adapter.getItemCount()) {
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- List<String> newDatas = new ArrayList<String>();
- for (int i = 0; i< 5; i++) {
- int index = i +1;
- newDatas.add("more item" + index);
- }
- adapter.addMoreItem(newDatas);
- }
- },1000);
- }
- }
- @Override
- public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
- super.onScrolled(recyclerView,dx, dy);
- lastVisibleItem =linearLayoutManager.findLastVisibleItemPosition();
- }
- });
运行效果如下:
(五).升级RecyclerView加入FootView实现上拉加载
上面我们虽然已经实现了上拉加载更多的效果,但是还比较丑陋,最起码要让用户知道确实在上拉加载的过程吧,例如加载一个底部的进度布局。这样一想,那么我们就按照ListView方式addFootView()呗,不过很可惜的是RecyclerView没有给我们提供addFootView()方法,那该怎么样办呢?我们来看RecyclerView.Apapter类:
我们要实现一个自定义Adapter一定需要实现onCreateViewHolder(ViewGroup paren,int viewType)方法,注意看方法中的第二个参数viewType,是不是想到布局类型了,也就是说该也支持多套布局显示的,那么查看基类中的所有方法如下:
上面有一个方法getItemType(),这个就和ListView的Adapter的实现差不多了,那么我们这边可以使用多套布局给RecyclerView加入一个FootView布局即可。RefreshFootAdapter.java具体实现流程如下:
1.加入布局状态标志-用来判断此时加载是普通Item还是foot view:
private static final int TYPE_ITEM =0; //普通Item View
private static final intTYPE_FOOTER = 1; //顶部FootView
2.重写getItemCount()方法,返回的Item数量在数据的基础上面+1,增加一项FootView布局项
- public intgetItemCount() {
- return mTitles.size()+1;
- }
3.重写getItemViewType方法来判断返回加载的布局的类型
- public int getItemViewType(int position) {
- // 最后一个item设置为footerView
- if (position + 1 == getItemCount()) {
- return TYPE_FOOTER;
- } else {
- return TYPE_ITEM;
- }
- }
4.接着onCreateViewHolder(ViewGroup parent,int viewType)加载布局的时候根据viewType的类型来选择指定的布局创建,返回即可:
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- //进行判断显示类型,来创建返回不同的View
- if(viewType==TYPE_ITEM){
- Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
- //这边可以做一些属性设置,甚至事件监听绑定
- //view.setBackgroundColor(Color.RED);
- ItemViewHolder itemViewHolder=new ItemViewHolder(view);
- return itemViewHolder;
- }else if(viewType==TYPE_FOOTER){
- Viewfoot_view=mInflater.inflate(R.layout.recycler_load_more_layout,parent,false);
- //这边可以做一些属性设置,甚至事件监听绑定
- //view.setBackgroundColor(Color.RED);
- FootViewHolder footViewHolder=new FootViewHolder(foot_view);
- return footViewHolder;
- }
- return null;
- }
5.最后进行判断数据的时候(onBindViewHolder),判断holder的类型来进行判定数据即可.
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- if(holder instanceof ItemViewHolder) {
- ((ItemViewHolder)holder).item_tv.setText(mTitles.get(position));
- holder.itemView.setTag(position);
- }else if(holder instanceof FootViewHolder){
- FootViewHolderfootViewHolder=(FootViewHolder)holder;
- switch (load_more_status){
- case PULLUP_LOAD_MORE:
- footViewHolder.foot_view_item_tv.setText("上拉加载更多...");
- break;
- case LOADING_MORE:
- footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");
- break;
- }
- }
- }
6.整个RefreshFootAdapter完整代码如下:
- packagecom.chinaztt.fda.adapter;
- public class RefreshFootAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
- //上拉加载更多
- public static final int PULLUP_LOAD_MORE=0;
- //正在加载中
- public static final int LOADING_MORE=1;
- //上拉加载更多状态-默认为0
- private int load_more_status=0;
- private LayoutInflater mInflater;
- private List<String> mTitles=null;
- private static final intTYPE_ITEM = 0; //普通Item View
- private static final intTYPE_FOOTER = 1; //顶部FootView
- public RefreshFootAdapter(Context context){
- this.mInflater=LayoutInflater.from(context);
- this.mTitles=new ArrayList<String>();
- for (int i=0;i<20;i++){
- int index=i+1;
- mTitles.add("item"+index);
- }
- }
- /**
- * item显示类型
- * @param parent
- * @param viewType
- * @return
- */
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- //进行判断显示类型,来创建返回不同的View
- if(viewType==TYPE_ITEM){
- Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);
- //这边可以做一些属性设置,甚至事件监听绑定
- //view.setBackgroundColor(Color.RED);
- ItemViewHolder itemViewHolder=new ItemViewHolder(view);
- return itemViewHolder;
- }else if(viewType==TYPE_FOOTER){
- Viewfoot_view=mInflater.inflate(R.layout.recycler_load_more_layout,parent,false);
- //这边可以做一些属性设置,甚至事件监听绑定
- //view.setBackgroundColor(Color.RED);
- FootViewHolder footViewHolder=new FootViewHolder(foot_view);
- return footViewHolder;
- }
- return null;
- }
- /**
- * 数据的绑定显示
- * @param holder
- * @param position
- */
- public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
- if(holder instanceof ItemViewHolder) {
- ((ItemViewHolder)holder).item_tv.setText(mTitles.get(position));
- holder.itemView.setTag(position);
- }else if(holder instanceof FootViewHolder){
- FootViewHolder footViewHolder=(FootViewHolder)holder;
- switch (load_more_status){
- case PULLUP_LOAD_MORE:
- footViewHolder.foot_view_item_tv.setText("上拉加载更多...");
- break;
- case LOADING_MORE:
- footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");
- break;
- }
- }
- }
- /**
- * 进行判断是普通Item视图还是FootView视图
- * @param position
- * @return
- */
- @Override
- public int getItemViewType(int position) {
- // 最后一个item设置为footerView
- if (position + 1 == getItemCount()) {
- return TYPE_FOOTER;
- } else {
- return TYPE_ITEM;
- }
- }
- @Override
- public int getItemCount() {
- return mTitles.size()+1;
- }
- //自定义的ViewHolder,持有每个Item的的所有界面元素
- public static class ItemViewHolder extends RecyclerView.ViewHolder {
- public TextView item_tv;
- public ItemViewHolder(View view){
- super(view);
- item_tv = (TextView)view.findViewById(R.id.item_tv);
- }
- }
- /**
- * 底部FootView布局
- */
- public static class FootViewHolder extends RecyclerView.ViewHolder{
- private TextView foot_view_item_tv;
- public FootViewHolder(View view) {
- super(view);
- foot_view_item_tv=(TextView)view.findViewById(R.id.foot_view_item_tv);
- }
- }
- //添加数据
- public void addItem(List<String> newDatas) {
- //mTitles.add(position, data);
- //notifyItemInserted(position);
- newDatas.addAll(mTitles);
- mTitles.removeAll(mTitles);
- mTitles.addAll(newDatas);
- notifyDataSetChanged();
- }
- public void addMoreItem(List<String> newDatas) {
- mTitles.addAll(newDatas);
- notifyDataSetChanged();
- }
- /**
- * //上拉加载更多
- * PULLUP_LOAD_MORE=0;
- * //正在加载中
- * LOADING_MORE=1;
- * //加载完成已经没有更多数据了
- * NO_MORE_DATA=2;
- * @param status
- */
- public void changeMoreStatus(int status){
- load_more_status=status;
- notifyDataSetChanged();
- }
- }
同时该Adaper中我还定义一个changeMoreStatus()方法和两个字符串常量可以来进行修改FootView中字符串提醒文本的。
7.整体Activity中还是设置监听RecyclerView的滚动事件.代码和第一个例子差不多,不过RecyclerView需要设置这边的Adapter了,demo_recycler.setAdapter(adapter= new RefreshFootAdapter(this));
- demo_recycler.setOnScrollListener(new RecyclerView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- super.onScrollStateChanged(recyclerView, newState);
- if (newState ==RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 ==adapter.getItemCount()) {
- adapter.changeMoreStatus(RefreshFootAdapter.LOADING_MORE);
- newHandler().postDelayed(new Runnable() {
- @Override
- public void run() {
- List<String> newDatas = new ArrayList<String>();
- for (int i = 0; i< 5; i++) {
- int index = i +1;
- newDatas.add("more item" + index);
- }
- adapter.addMoreItem(newDatas);
- adapter.changeMoreStatus(RefreshFootAdapter.PULLUP_LOAD_MORE);
- }
- }, 2500);
- }
- }
- @Override
- public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
- super.onScrolled(recyclerView,dx, dy);
- lastVisibleItem =linearLayoutManager.findLastVisibleItemPosition();
- }
- });
查看代码之后,大家肯定也发现在onScrollStateChanged()方法中,Adapter.addMoreItem()和Adapter.changeMoreStatus()方法内部都调用了notifyDataSetChanged()方法,也就是说这边刷新了两次,针对这个问题,大家可以把第二个方法放入到addMoreItem()内部去,调用一次刷新操作接口。同时也可以自己按照实际需求进行优化。
8.运行效果如下:
(六).最后总结
今天我们通过SwipeRefreshLayout和RecyclerView结合以及改造Adapter方式实现了RecyclerView的下拉刷新和上拉加载更多的效果。
本次具体实例注释过的全部代码已经上传到FastDev4Android项目中了。同时欢迎大家去Github站点进行clone或者下载浏览:
https://github.com/jiangqqlmj/FastDev4Android 同时欢迎大家star和fork整个开源快速开发框架项目~
本人录制AA(Android Annotations)注入框架的视频教程已经上线了,欢迎大家前往观看。http://www.cniao5.com/course/10074
尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!
关注我的订阅号,每天分享移动开发技术(Android/IOS),项目管理以及博客文章!
关注我的微博,可以获得更多精彩内容
- 顶
- 28
- 踩
- 0
- 上一篇【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)
- 下一篇【FastDev4Android框架开发】CardView完全解析与RecyclerView结合使用(三十二)
- • 【FastDev4Android框架开发】Android 数据缓存器ACache的详解和使用(四)
- • SDCC 2017之大数据技术实战线上峰会
- • 【FastDev4Android框架开发】HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)
- • Hadoop大数据从入门到精通知识体系详解
- • Android控件postDelayed用法,View自带的定时器
- • SDCC 2017之区块链技术实战线上峰会
- • 【FastDev4Android框架开发】消息总线EventBus源码分析以及与Otto框架对比(二十一)
- • C++跨平台开发和ffmpeg,opencv音视频技术
- • 主线程上延时,使用postDelayed
- • 史上最全Android基础知识总结
- • 【FastDev4Android框架开发】RecyclerView完全解析,让你从此爱上它(二十八)
- • 机器学习需要的数学知识
- • 【FastDev4Android框架开发】RecyclerView完全解析之打造新版类Gallery效果(二十九)
- • 关于android中postDelayed方法的讲解
- • 【FastDev4Android框架开发】神器ViewDragHelper完全解析之详解实现QQ5.X侧滑酷炫效果(三十四)
- • 【FastDev4Android框架开发】BaseAdapterHelper详解源码分析,让你摆脱狂写一堆Adapter烦恼(二十五)
- 14楼 chemin5202017-07-20 17:35发表 [回复]
- 研究了一下,解决了不满一页footview会出现的问题,
首先多定义一个标记LOADING_END ,默认是0:
public static final int PULLUP_LOAD_MORE = 2;
public static final int LOADING_MORE = 1;
//没有加载的时候
public static final int LOADING_END = 0;
把footview的根布局find出来,默认是gone,贴上改变的代码
switch (load_more_status) {
case PULLUP_LOAD_MORE:
footViewHolderfoot_view_item_containersetVisibility(ViewVISIBLE);
footViewHolderfoot_view_item_tvsetText("上拉加载更多...");
break;
case LOADING_MORE:
footViewHolderfoot_view_item_containersetVisibility(ViewVISIBLE);
footViewHolderfoot_view_item_tv.setText("正在加载更多数据...");
break;
case LOADING_END:
footViewHolderfoot_view_item_containesetVisibility(ViewGONE);
break;
}
数据加载完成后调用adapterchangeMoreStatus(RefreshFootAdapterLOADING_END);
就OK了,希望对大家有帮助~(PS.代码中去掉了".")
- Re: black_and_blue2017-08-28 13:44发表 [回复]
- 回复chemin520:看样子还不错.
- 13楼 chemin5202017-07-20 17:33发表 [回复]
- 研究了一下,解决了不满一页footview会出现的问题,
首先多定义一个标记LOADING_END ,默认是0:
public static final int PULLUP_LOAD_MORE = 2;
public static final int LOADING_MORE = 1;
//没有加载的时候
public static final int LOADING_END = 0;
把footview的根布局find出来,默认是gone,贴上改变的代码
switch (load_more_status) {
case PULLUP_LOAD_MORE:
footViewHolderfoot_view_item_containersetVisibility(View.VISIBLE);
footViewHolderfoot_view_item_tvsetText("上拉加载更多...");
break;
case LOADING_MORE:
footViewHolderfoot_view_item_containersetVisibility(View.VISIBLE);
footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");
break;
case LOADING_END:
footViewHolderfoot_view_item_containe.setVisibility(View.GONE);
break;
}
数据加载完成后调用adapterchangeMoreStatus(RefreshFootAdapterLOADING_END);
就OK了,希望对大家有帮助~(PS.由于被误认为是链接,所以把.去掉了)
- 12楼 greenfly2017-05-18 11:40发表 [回复]
- 写的不错,不过有些细节对于新手来说会比较麻烦,不满一页的时候一直显示加载,到最后一页还显示加载,用户体验会比较差,网上搜索也没有结果,花点时间调试了下,用下面代码可以实现不满一页的时候隐藏footview,和下拉到最后一页的时候,不再显示footview
@Override
public int getItemViewType(int position) {
// 最后一个item设置为footerView
if (position + 1 == getItemCount()) {
if(totalPage>1&&getItemCount()<totalRecord){
return TYPE_FOOTER;
}else{
return TYPE_ITEM;
}
//return TYPE_FOOTER;
} else {
return TYPE_ITEM;
}
}
@Override
public int getItemCount() {
return mDatas.size();
}还有个思路就是让footview显示2秒自动隐藏,这个方法会比较方便些。
- Re: 小神的烦恼2017-06-13 16:02发表 [回复]
- 回复greenfly:if(totalPage>1&&getItemCount()<totalRecord)中totalPage是页数吗?totalRecord是什么?
- Re: qq_388631902017-05-20 17:30发表 [回复]
- 回复greenfly:您写的totalPage是指什么?totalRecord又是指什么呢?能详细贴出来吗
- 10楼 haohao123nana2016-11-25 17:52发表 [回复]
- 不错不错,学习了
- 8楼 chaoxionghuai2016-08-05 16:08发表 [回复]
- 楼主 ,当第一页数据不满屏 时,怎样隐藏footer,有这方面的处理思路吗,貌似这个问题挺常见的
- 7楼 qq_5272358902016-05-02 18:31发表 [回复]
- 不适合新手,但还是谢谢
- Re: qq_333412182017-02-08 15:05发表 [回复]
- 回复SnowWitch:要动态设置adapter的getItemCount的返回个数,既然有上拉加载更多,那就是分页请求,请求接口的时候肯定要传一个数值,如果返回的数据集合小于传入的这个数值,那就说明服务器没有更多的数据了,getItemCount的返回个数就不需要+1
@Override
public int getItemCount() {
if(mTitles.size() < 分页请求的数值)
{
return mTitles.size()
}else
{
return mTitles.size()+1;
}
}
- 5楼 qq1686100102016-01-13 21:14发表 [回复]
- 博主是选择如何隐藏footerView的,上面的代码好像没有啊?
- 4楼 awenshixiaocao2016-01-07 16:12发表 [回复]
- 好厉害的demo,太感谢了,学了很多东西
- 3楼 IT_Transformers2015-11-27 17:07发表 [回复]
- 你有试过数据不足一屏的时候 上拉加载吗?
- Re: IT_Transformers2015-11-27 17:13发表 [回复]
- 回复江清清:能提供一个思路吗?我最近在学习recyclerview
- 2楼 zhiyou13802015-11-26 13:31发表 [回复]
- 不错不错哦~!!
- 1楼 stupid_boy11032015-11-23 14:45发表 [回复]
- 很不错,收藏了先
- 用 户 名:
- Leaning_wk
- 评论内容:
- 博客专栏
React Native学习指南
文章:24篇 阅读:267557 |
FastDev4Android
文章:38篇 阅读:228684 |
AndroidAnnotations详解
文章:11篇 阅读:23097 |
Android进阶与专题
文章:8篇 阅读:29586 |
RoboGuice注入框架
文章:14篇 阅读:25891 |
【IOS入门与进阶】
文章:13篇 阅读:47984 |
【Objective-C入门与进阶】
文章:24篇 阅读:66720 |
- 文章分类
- Java(10)
- Web(3)
- Android-例子(17)
- Android基础(33)
- 设计模式(8)
- 数据结构(2)
- UML(2)
- 版本控制(1)
- Struts(7)
- 工作与生活(4)
- JNI与NDK(4)
- Android_Frameworks(1)
- IOS学习笔记(14)
- Objective-C(24)
- 百度地图学习(5)
- RoboGuice(14)
- Android专题知识点(7)
- HTML5(2)
- FastDev快速开发框架(38)
- AndroidAnnotations(11)
- 优秀开源框架(1)
- React Native(25)
- 阅读排行
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)(47764)
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)(31581)
- 【React Native开发】React Native开发IDE安装及配置(2)(21438)
- 【React Native开发】React Native控件之ListView组件讲解以及最齐全实例(19)(20997)
- Android中的WebView进行直接加载网页(20807)
- 【React Native开发】React Native控件之Text组件讲解(9)(18578)
- 【FastDev4Android框架开发】神器ViewDragHelper完全解析,妈妈再也不担心我自定义ViewGroup滑动View操作啦~(三十三)(17940)
- 【React Native开发】React Native应用设备运行(Running)以及调试(Debugging)(3)(17681)
- 【React Native开发】React Native For Android环境配置以及第一个实例(1)(17284)
- 【React Native开发】React Native进行签名打包成Apk(5)(15791)
- 评论排行
- 过几天就要去公司报道了,记录一下这段时间找工作的经历....(36)
- 跟着郑平老师做通讯录小项目时学到布局界面底部的控件(32)
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)(27)
- 【React Native开发】React Native移植原生Android项目(4)(24)
- 【React Native开发】React Native For Android环境配置以及第一个实例(1)(24)
- Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)(22)
- 2015年终总结,忙碌与有所收获的一年,2016年继续努力!(21)
- Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)(20)
- 模拟实现网易新闻客户端主界面(侧滑SlidingMenu+ViewPager+Fragment)(20)
- 使用开源组件slidingmenu_library来模拟实现人人客户端的主页侧滑界面(19)
- 推荐文章
- 最新评论
- React Native开源项目-嘎嘎商城客户端(持续更新中)
飞同小可: https://github.com/gagakj/GaGaMall/issues/17后来我自己觉...
- React Native开源项目-嘎嘎商城客户端(持续更新中)
飞同小可: 报错SyntaxError:Strict mode does not allow function ...
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
L_Fork: 改为 mTitles.addAll(0, newDatas);
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
black_and_blue: @chemin520:看样子还不错.
- 【React Native开发】React Native进行签名打包成Apk(5)
pony1179: @u010411264: storeFilefile 应为 storeFile file ,之间有个...
- 【React Native开发】React Native控件之WebView组件详解以及实例使用(22)
yigouzhen9757: 请问一下有webview与html通信的demo吗,学习一下
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
帅哥镶金牙: 你给的这个github地址哪里找得到你这项目的代码啊,真的找得人都心烦意乱
- 【FastDev4Android框架开发】AndroidAnnnotations注入框架介绍和Android Studios基本配置(七)
brilliant_stone: 打包时,AndroidAnnotations 是如何进行混淆的?
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
chemin520: 研究了一下,解决了不满一页footview会出现的问题,首先多定义一个标记LOADING_END ,...
- 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
chemin520: 研究了一下,解决了不满一页footview会出现的问题,首先多定义一个标记LOADING_END ,...
- 底部悬停
【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)的更多相关文章
- Android如何定制一个下拉刷新,上滑加载更多的容器
前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...
- Android之下拉刷新,上啦加载的实现(一)
转载地址http://blog.csdn.net/leehong2005/article/details/12567757#t5 前段时间项目中用到了下拉刷新功能,之前在网上也找到过类似的demo,但 ...
- iOS开发 XML解析和下拉刷新,上拉加载更多
iOS开发 XML解析和下拉刷新,上拉加载更多 1.XML格式 <?xml version="1.0" encoding="utf-8" ?> 表示 ...
- 使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。
套用mui官方文档的一句话:“开发者只需关心业务逻辑,实现加载更多数据即可”.真的是不错的框架. 想更多的了解这个框架:http://dev.dcloud.net.cn/mui/ 那么如何实现下拉刷新 ...
- 微信小程序之下拉刷新,上拉更多列表实现
代码地址如下:http://www.demodashi.com/demo/11110.html 一.准备工作 首先需要下载小程序开发工具 官方下载地址: https://mp.weixin.qq.co ...
- 微信小程序开发之 下拉刷新,上拉加载更多
本文记载了如何在微信小程序里面实现下拉刷新,上拉加载更多 先开看一下界面 大致如此的界面吧. 这个Demo使用了微信的几个Api和事件,我先列出来. 1.wx.request (获取远程服务器的数据, ...
- react + iscroll5 实现完美 下拉刷新,上拉加载
经过几天的反复折腾,总算做出一个体验还不错的列表页了,主要支持了下拉刷新,上拉加载两个功能. 一开始直接采用了react-iscroll插件,它是基于iscroll插件开发的组件.但是开发过程中,发现 ...
- Android打造(ListView、GridView等)通用的下拉刷新、上拉自动加载的组件
原文 http://blog.csdn.net/bboyfeiyu/article/details/39253051 前言 下 拉刷新组件在开发中使用率是非常高的,基本上联网的APP都会采 ...
- 前端提升生产力系列三(vant3 vue3 移动端H5下拉刷新,上拉加载组件的封装)
| 在日常的移动端开发中,经常会遇到列表的展示,以及数据量变多的情况下还会有上拉和下拉的操作.进入新公司后发现移动端好多列表,但是在看代码的时候发现,每个列表都是单独的代码,没有任何的封装,都是通过v ...
随机推荐
- 最新版自动检测卡片类型工具软件版本(auto check card type v3.2.0)
自动检测卡片类型工具软件. 卡片放到读卡器上面自动识别卡片类型,不需老是按下按钮,好用,方便.支持自动识别NTAG213卡片,NTAG215卡片, NTAG216卡片,Ultralight芯片, Ul ...
- 记C++中发现的隐式转换问题
#include <iostream> #include <string> using std::cin; using std::cout; using std::endl; ...
- 数据表损坏:Incorrect key file for table
最近做项目过程中,调用数据库内容,老是出现一些类似于数据表损坏的提示信息(Incorrect key file for table edison_category),查询不到数据,很是恼火,后来冷静下 ...
- mysql_pw 指令 数据库创建过程
------------------pw_db数据库创建过程各表创建指令-------------------------- create database pw_db; #创建一个数据库use pw ...
- codeforces- Shortest path of the king
The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose heart, becaus ...
- ApacheBench(ab)压力测试工具
服务器负载太大而影响程序效率也是很常见的,Apache服务器自带有一个叫AB(ApacheBench)的工具,可以对服务器进行负载测试 基本用法: ab -n 全部请求数 -c 并发数测试url 注 ...
- EBCDIK,EBCDIC,ASCII,shift JIS間の変換
http://itdoc.hitachi.co.jp/manuals/3020/3020759580/G5950334.HTM#ID01056
- Rect Native 使用
参见 Rect Native 中文官网. 依赖环境: Homebrew.npm.Node.js.Watchman(监测Bug和文件变化,触发指定操作).flow(JS静态类型检查仪,以方便找出代码中错 ...
- Faster-RCNN Pytorch实现的minibatch包装
实际上faster-rcnn对于输入的图片是有resize操作的,在resize的图片基础上提取feature map,而后generate一定数量的RoI. 我想首先去掉这个resize的操作,对每 ...
- selenium webdriver 屏幕滚动
//山寨法 String setscroll = "document.documentElement.scrollTop=100"; JavascriptExecutor jse= ...