700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

时间:2024-04-25 06:28:30

相关推荐

【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)...

转载请标明出处:

/developer_jiangqq/article/details/49992269

本文出自:【江清清的博客】

(一).前言:

【好消息】个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:

话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比ListView,GridView之类控件有很多的优点,例如:数据绑定,Item View创建,View的回收以及重用等机制。前三三篇文章已经贡呢更新了以下三个部分:

RecyclerView控件的基本使用,包括基础,进阶,高级部分,动画之类(点击进入)RecyclerView控件的实战实例(点击进入)RecyclerView控件集合AA(Android Annotations)注入框架实例(点击进入)

本来这个专题不打算更新,不过前两天看到各位童鞋还是挺积极的评论到,希望可以更新RecyclerView加入下拉刷新和上拉加载更多的功能。正好昨天周末,所以我这边也就实现了这样的功能,今天更新一下。具体代码已经上传到下面的项目中,欢迎各位去star和fork一下。

FastDev4Android框架项目地址:/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布局即可,具体布局文件如下:

[html]view plaincopy <?xmlversionxmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:androidLinearLayoutxmlns:android="/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.SwipeRefreshLayoutandroid:id="@+id/demo_swiperefreshlayout"android:layout_width="fill_parent"android:layout_height="fill_parent"android:scrollbars="vertical"><android.support.v7.widget.RecyclerViewandroid: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的隐藏或者显示效果。具体代码如下:

[java]view plaincopy demo_swiperefreshlayout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener(){@OverridepublicvoidonRefresh(){Log.d("zttjiangqq","invokeonRefresh...");newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){List<String>newDatas=newArrayList<String>();for(inti=0;i<5;i++){intindex=i+1;newDatas.add("newitem"+index);}adapter.addItem(newDatas);demo_swiperefreshlayout.setRefreshing(false);Toast.makeText(RecyclerRefreshActivity.this,"更新了五条数据...",Toast.LENGTH_SHORT).show();}},5000);}});

3.除此之外我们也来看一下Adapter和Activity中的其他代码,也方便各位童鞋查看。

[java]view plaincopy RecyclerRefreshActivity.javapublicclassRecyclerRefreshActivityextendsBaseActivity{privateLinearLayouttop_bar_linear_back;privateTextViewtop_bar_title;privateSwipeRefreshLayoutdemo_swiperefreshlayout;privateRecyclerViewdemo_recycler;privateRefreshRecyclerAdapteradapter;privateLinearLayoutManagerlinearLayoutManager;privateintlastVisibleItem;@OverrideprotectedvoidonCreate(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(newCustomOnClickListener());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(PLEX_UNIT_DIP,24,getResources().getDisplayMetrics()));linearLayoutManager=newLinearLayoutManager(this);linearLayoutManager.setOrientation(OrientationHelper.VERTICAL);demo_recycler.setLayoutManager(linearLayoutManager);//添加分隔线demo_recycler.addItemDecoration(newAdvanceDecoration(this,OrientationHelper.VERTICAL));demo_recycler.setAdapter(adapter=newRefreshRecyclerAdapter(this));demo_swiperefreshlayout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener(){@OverridepublicvoidonRefresh(){Log.d("zttjiangqq","invokeonRefresh...");newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){List<String>newDatas=newArrayList<String>();for(inti=0;i<5;i++){intindex=i+1;newDatas.add("newitem"+index);}adapter.addItem(newDatas);demo_swiperefreshlayout.setRefreshing(false);Toast.makeText(RecyclerRefreshActivity.this,"更新了五条数据...",Toast.LENGTH_SHORT).show();}},5000);}});classCustomOnClickListenerimplementsView.OnClickListener{@OverridepublicvoidonClick(Viewv){RecyclerRefreshActivity.this.finish();}}}[java]view plaincopy RefreshRecyclerAdapter.javapublicclassRefreshRecyclerAdapterextendsRecyclerView.Adapter<RefreshRecyclerAdapter.ViewHolder>{privateLayoutInflatermInflater;privateList<String>mTitles=null;publicRefreshRecyclerAdapter(Contextcontext){this.mInflater=LayoutInflater.from(context);this.mTitles=newArrayList<String>();for(inti=0;i<20;i++){intindex=i+1;mTitles.add("item"+index);}}/***item显示类型*@paramparent*@paramviewType*@return*/@OverridepublicViewHolderonCreateViewHolder(ViewGroupparent,intviewType){finalViewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);//这边可以做一些属性设置,甚至事件监听绑定//view.setBackgroundColor(Color.RED);ViewHolderviewHolder=newViewHolder(view);returnviewHolder;}/***数据的绑定显示*@paramholder*@paramposition*/@OverridepublicvoidonBindViewHolder(ViewHolderholder,intposition){holder.item_tv.setText(mTitles.get(position));holder.itemView.setTag(position);}@OverridepublicintgetItemCount(){returnmTitles.size();}//自定义的ViewHolder,持有每个Item的的所有界面元素publicstaticclassViewHolderextendsRecyclerView.ViewHolder{publicTextViewitem_tv;publicViewHolder(Viewview){super(view);item_tv=(TextView)view.findViewById(R.id.item_tv);}}//添加数据publicvoidaddItem(List<String>newDatas){//mTitles.add(position,data);//notifyItemInserted(position);newDatas.addAll(mTitles);mTitles.removeAll(mTitles);mTitles.addAll(newDatas);notifyDataSetChanged();}publicvoidaddMoreItem(List<String>newDatas){mTitles.addAll(newDatas);notifyDataSetChanged();}}

以上重要地方的注释已经加上去了。

5.运行效果如下:

(四).RecyclerView设置滚动事件加入上拉加载更多功能

下面我们再来看RecyclerView和相关类的一些特性,

LayoutManger给我们提供了以下几个方法来让开发者方便的获取到屏幕上面的顶部item和顶部item相关的信息:

findFirstVisibleItemPosition()findFirstCompletlyVisibleItemPosition()findLastVisibleItemPosition()findLastCompletlyVisibleItemPosition()

同时通过Recycler.Adapter的getItemCount()方法可以轻松获取到RecyclerView列表中ItemView的个数。

那么下面我们通过监听滑动(滚动)事件,然后在里边判断是否已经滑动到最底部来加载更多的数据,使用方法如下:

[java]view plaincopy //RecyclerView滑动监听demo_recycler.setOnScrollListener(newRecyclerView.OnScrollListener(){@OverridepublicvoidonScrollStateChanged(RecyclerViewrecyclerView,intnewState){super.onScrollStateChanged(recyclerView,newState);if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==adapter.getItemCount()){newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){List<String>newDatas=newArrayList<String>();for(inti=0;i<5;i++){intindex=i+1;newDatas.add("moreitem"+index);}adapter.addMoreItem(newDatas);}},1000);}}@OverridepublicvoidonScrolled(RecyclerViewrecyclerView,intdx,intdy){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布局项

[java]view plaincopy publicintgetItemCount(){returnmTitles.size()+1;}

3.重写getItemViewType方法来判断返回加载的布局的类型

[java]view plaincopy publicintgetItemViewType(intposition){//最后一个item设置为footerViewif(position+1==getItemCount()){returnTYPE_FOOTER;}else{returnTYPE_ITEM;}}

4.接着onCreateViewHolder(ViewGroup parent,int viewType)加载布局的时候根据viewType的类型来选择指定的布局创建,返回即可:

[java]view plaincopy publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){//进行判断显示类型,来创建返回不同的Viewif(viewType==TYPE_ITEM){Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);//这边可以做一些属性设置,甚至事件监听绑定//view.setBackgroundColor(Color.RED);ItemViewHolderitemViewHolder=newItemViewHolder(view);returnitemViewHolder;}elseif(viewType==TYPE_FOOTER){Viewfoot_view=mInflater.inflate(R.layout.recycler_load_more_layout,parent,false);//这边可以做一些属性设置,甚至事件监听绑定//view.setBackgroundColor(Color.RED);FootViewHolderfootViewHolder=newFootViewHolder(foot_view);returnfootViewHolder;}returnnull;}

5.最后进行判断数据的时候(onBindViewHolder),判断holder的类型来进行判定数据即可.

[java]view plaincopy publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){if(holderinstanceofItemViewHolder){((ItemViewHolder)holder).item_tv.setText(mTitles.get(position));holder.itemView.setTag(position);}elseif(holderinstanceofFootViewHolder){FootViewHolderfootViewHolder=(FootViewHolder)holder;switch(load_more_status){casePULLUP_LOAD_MORE:footViewHolder.foot_view_item_tv.setText("上拉加载更多...");break;caseLOADING_MORE:footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");break;}}} 6.整个RefreshFootAdapter完整代码如下:[java]view plaincopy packagecom.chinaztt.fda.adapter;publicclassRefreshFootAdapterextendsRecyclerView.Adapter<RecyclerView.ViewHolder>{//上拉加载更多publicstaticfinalintPULLUP_LOAD_MORE=0;//正在加载中publicstaticfinalintLOADING_MORE=1;//上拉加载更多状态-默认为0privateintload_more_status=0;privateLayoutInflatermInflater;privateList<String>mTitles=null;privatestaticfinalintTYPE_ITEM=0;//普通ItemViewprivatestaticfinalintTYPE_FOOTER=1;//顶部FootViewpublicRefreshFootAdapter(Contextcontext){this.mInflater=LayoutInflater.from(context);this.mTitles=newArrayList<String>();for(inti=0;i<20;i++){intindex=i+1;mTitles.add("item"+index);}}/***item显示类型*@paramparent*@paramviewType*@return*/publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent,intviewType){//进行判断显示类型,来创建返回不同的Viewif(viewType==TYPE_ITEM){Viewview=mInflater.inflate(R.layout.item_recycler_layout,parent,false);//这边可以做一些属性设置,甚至事件监听绑定//view.setBackgroundColor(Color.RED);ItemViewHolderitemViewHolder=newItemViewHolder(view);returnitemViewHolder;}elseif(viewType==TYPE_FOOTER){Viewfoot_view=mInflater.inflate(R.layout.recycler_load_more_layout,parent,false);//这边可以做一些属性设置,甚至事件监听绑定//view.setBackgroundColor(Color.RED);FootViewHolderfootViewHolder=newFootViewHolder(foot_view);returnfootViewHolder;}returnnull;}/***数据的绑定显示*@paramholder*@paramposition*/publicvoidonBindViewHolder(RecyclerView.ViewHolderholder,intposition){if(holderinstanceofItemViewHolder){((ItemViewHolder)holder).item_tv.setText(mTitles.get(position));holder.itemView.setTag(position);}elseif(holderinstanceofFootViewHolder){FootViewHolderfootViewHolder=(FootViewHolder)holder;switch(load_more_status){casePULLUP_LOAD_MORE:footViewHolder.foot_view_item_tv.setText("上拉加载更多...");break;caseLOADING_MORE:footViewHolder.foot_view_item_tv.setText("正在加载更多数据...");break;}}}/***进行判断是普通Item视图还是FootView视图*@paramposition*@return*/@OverridepublicintgetItemViewType(intposition){//最后一个item设置为footerViewif(position+1==getItemCount()){returnTYPE_FOOTER;}else{returnTYPE_ITEM;}}@OverridepublicintgetItemCount(){returnmTitles.size()+1;}//自定义的ViewHolder,持有每个Item的的所有界面元素publicstaticclassItemViewHolderextendsRecyclerView.ViewHolder{publicTextViewitem_tv;publicItemViewHolder(Viewview){super(view);item_tv=(TextView)view.findViewById(R.id.item_tv);}}/***底部FootView布局*/publicstaticclassFootViewHolderextendsRecyclerView.ViewHolder{privateTextViewfoot_view_item_tv;publicFootViewHolder(Viewview){super(view);foot_view_item_tv=(TextView)view.findViewById(R.id.foot_view_item_tv);}}//添加数据publicvoidaddItem(List<String>newDatas){//mTitles.add(position,data);//notifyItemInserted(position);newDatas.addAll(mTitles);mTitles.removeAll(mTitles);mTitles.addAll(newDatas);notifyDataSetChanged();}publicvoidaddMoreItem(List<String>newDatas){mTitles.addAll(newDatas);notifyDataSetChanged();}/***//上拉加载更多*PULLUP_LOAD_MORE=0;*//正在加载中*LOADING_MORE=1;*//加载完成已经没有更多数据了*NO_MORE_DATA=2;*@paramstatus*/publicvoidchangeMoreStatus(intstatus){load_more_status=status;notifyDataSetChanged();}}

同时该Adaper中我还定义一个changeMoreStatus()方法和两个字符串常量可以来进行修改FootView中字符串提醒文本的。

7.整体Activity中还是设置监听RecyclerView的滚动事件.代码和第一个例子差不多,不过RecyclerView需要设置这边的Adapter了,demo_recycler.setAdapter(adapter= new RefreshFootAdapter(this));

[java]view plaincopy demo_recycler.setOnScrollListener(newRecyclerView.OnScrollListener(){@OverridepublicvoidonScrollStateChanged(RecyclerViewrecyclerView,intnewState){super.onScrollStateChanged(recyclerView,newState);if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==adapter.getItemCount()){adapter.changeMoreStatus(RefreshFootAdapter.LOADING_MORE);newHandler().postDelayed(newRunnable(){@Overridepublicvoidrun(){List<String>newDatas=newArrayList<String>();for(inti=0;i<5;i++){intindex=i+1;newDatas.add("moreitem"+index);}adapter.addMoreItem(newDatas);adapter.changeMoreStatus(RefreshFootAdapter.PULLUP_LOAD_MORE);}},2500);}}@OverridepublicvoidonScrolled(RecyclerViewrecyclerView,intdx,intdy){super.onScrolled(recyclerView,dx,dy);lastVisibleItem=linearLayoutManager.findLastVisibleItemPosition();}});

查看代码之后,大家肯定也发现在onScrollStateChanged()方法中,Adapter.addMoreItem()和Adapter.changeMoreStatus()方法内部都调用了notifyDataSetChanged()方法,也就是说这边刷新了两次,针对这个问题,大家可以把第二个方法放入到addMoreItem()内部去,调用一次刷新操作接口。同时也可以自己按照实际需求进行优化。

8.运行效果如下:

(六).最后总结

今天我们通过SwipeRefreshLayout和RecyclerView结合以及改造Adapter方式实现了RecyclerView的下拉刷新和上拉加载更多的效果。

本次具体实例注释过的全部代码已经上传到FastDev4Android项目中了。同时欢迎大家去Github站点进行clone或者下载浏览:

/jiangqqlmj/FastDev4Android同时欢迎大家star和fork整个开源快速开发框架项目~

本人录制AA(Android Annotations)注入框架的视频教程已经上线了,欢迎大家前往观看。/course/10074

尊重原创,转载请注明:From Sky丶清(/developer_jiangqq) 侵权必究!

关注我的订阅号,每天分享移动开发技术(Android/IOS),项目管理以及博客文章!

关注我的微博,可以获得更多精彩内容

顶28踩0 上一篇【FastDev4Android框架开发】RecyclerView完全解析之结合AA(Android Annotations)注入框架实例(三十)下一篇【FastDev4Android框架开发】CardView完全解析与RecyclerView结合使用(三十二) 相关文章推荐 •【FastDev4Android框架开发】Android 数据缓存器ACache的详解和使用(四)•SDCC 之大数据技术实战线上峰会•【FastDev4Android框架开发】HorizontalScrollView,Fragment,FragmentStatePagerAdapter打造网易新闻Tab及滑动页面效果(三十六)•Hadoop大数据从入门到精通知识体系详解•Android控件postDelayed用法,View自带的定时器•SDCC 之区块链技术实战线上峰会•【FastDev4Android框架开发】消息总线EventBus源码分析以及与Otto框架对比(二十一)•C++跨平台开发和ffmpeg,opencv音视频技术•主线程上延时,使用postDelayed•史上最全Android基础知识总结•【FastDev4Android框架开发】RecyclerView完全解析,让你从此爱上它(二十八)•机器学习需要的数学知识•【FastDev4Android框架开发】RecyclerView完全解析之打造新版类Gallery效果(二十九)•关于android中postDelayed方法的讲解•【FastDev4Android框架开发】神器ViewDragHelper完全解析之详解实现QQ5.X侧滑酷炫效果(三十四)•【FastDev4Android框架开发】BaseAdapterHelper详解源码分析,让你摆脱狂写一堆Adapter烦恼(二十五) 查看评论 16楼L_Fork-09-05 17:46发表 [回复]改为 mTitles.addAll(0, newDatas);15楼帅哥镶金牙-08-15 21:18发表 [回复]你给的这个github地址哪里找得到你这项目的代码啊,真的找得人都心烦意乱14楼chemin520-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(&quot;上拉加载更多...&quot;);

break;

case LOADING_MORE:

footViewHolderfoot_view_item_containersetVisibility(ViewVISIBLE);

footViewHolderfoot_view_item_tv.setText(&quot;正在加载更多数据...&quot;);

break;

case LOADING_END:

footViewHolderfoot_view_item_containesetVisibility(ViewGONE);

break;

}

数据加载完成后调用adapterchangeMoreStatus(RefreshFootAdapterLOADING_END);

就OK了,希望对大家有帮助~(PS.代码中去掉了&quot;.&quot;)Re:black_and_blue-08-28 13:44发表 [回复]回复chemin520:看样子还不错.13楼chemin520-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(&quot;上拉加载更多...&quot;);

break;

case LOADING_MORE:

footViewHolderfoot_view_item_containersetVisibility(View.VISIBLE);

footViewHolder.foot_view_item_tv.setText(&quot;正在加载更多数据...&quot;);

break;

case LOADING_END:

footViewHolderfoot_view_item_containe.setVisibility(View.GONE);

break;

}

数据加载完成后调用adapterchangeMoreStatus(RefreshFootAdapterLOADING_END);

就OK了,希望对大家有帮助~(PS.由于被误认为是链接,所以把.去掉了)12楼greenfly-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:小神的烦恼-06-13 16:02发表 [回复]回复greenfly:if(totalPage>1&&getItemCount()<totalRecord)中totalPage是页数吗?totalRecord是什么?Re:qq_38863190-05-20 17:30发表 [回复]回复greenfly:您写的totalPage是指什么?totalRecord又是指什么呢?能详细贴出来吗11楼greenfly-05-15 17:14发表 [回复]thank you.10楼haohao123nana-11-25 17:52发表 [回复]不错不错,学习了9楼雪谷歧路-08-25 16:56发表 [回复]请问加载完成之后怎么隐藏加载更多的footer啊,我发现很多人都没写一点,自己也尝试很久都没用,望解答8楼chaoxionghuai-08-05 16:08发表 [回复]楼主 ,当第一页数据不满屏 时,怎样隐藏footer,有这方面的处理思路吗,貌似这个问题挺常见的7楼qq_527235890-05-02 18:31发表 [回复]不适合新手,但还是谢谢6楼SnowWitch-02-22 09:23发表 [回复]博主,如果数据不足一页,那个footview也会显示出来,该如何隐藏呢?希望博主指点一下。Re:qq_33341218-02-08 15:05发表 [回复]回复SnowWitch:要动态设置adapter的getItemCount的返回个数,既然有上拉加载更多,那就是分页请求,请求接口的时候肯定要传一个数值,如果返回的数据集合小于传入的这个数值,那就说明服务器没有更多的数据了,getItemCount的返回个数就不需要+1

@Override

public int getItemCount() {

if(mTitles.size() < 分页请求的数值)

{

return mTitles.size()

}else

{

return mTitles.size()+1;

}

}Re:SnowWitch-02-10 22:32发表 [回复]回复qq_33341218:嗯嗯,谢谢亲5楼qq168610010-01-13 21:14发表 [回复]博主是选择如何隐藏footerView的,上面的代码好像没有啊?4楼awenshixiaocao-01-07 16:12发表 [回复]好厉害的demo,太感谢了,学了很多东西Re:江清清-01-07 16:15发表 [回复]回复awenshixiaocao:感谢支持关注一下,不断学习吧,3楼IT_Transformers-11-27 17:07发表 [回复]你有试过数据不足一屏的时候 上拉加载吗?Re:江清清-11-27 17:10发表 [回复]回复IT_Transformers:如果是这种情况会有其他的方式处理Re:IT_Transformers-11-27 17:13发表 [回复]回复江清清:能提供一个思路吗?我最近在学习recyclerview2楼zhiyou1380-11-26 13:31发表 [回复]不错不错哦~!!Re:江清清-11-26 13:42发表 [回复]回复zhiyou1380:感谢支持,后面也希望可以写出质量更高的文章 和大家一起分享1楼stupid_boy1103-11-23 14:45发表 [回复]很不错,收藏了先Re:江清清-11-23 14:50发表 [回复]回复stupid_boy1103:感谢支持。 发表评论 用 户 名:Leaning_wk评论内容: * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 个人资料

江清清访问:1104090次积分:12921等级:排名:第1072名原创:215篇转载:5篇译文:1篇评论:590条 联系方式

姓名:江清清本科:北方民族大学度-CSDN博客之星个人站点:QQ:781931404邮箱:jiangqqlmj@

本人录制视频Android实战项目菜鸟新闻视频,点击进入...

Android Annotations学习视频,点击进入... 博客专栏 文章分类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) 文章存档 01月(1)08月(1)02月(8)01月(16)12月(5)展开 阅读排行【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)终总结,忙碌与有所收获的一年,继续努力!(21)Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显示在客户端上面】)(20)模拟实现网易新闻客户端主界面(侧滑SlidingMenu+ViewPager+Fragment)(20)使用开源组件slidingmenu_library来模拟实现人人客户端的主页侧滑界面(19) 推荐文章* CSDN日报0828——《4个方法快速打造你的阅读清单》* Android检查更新下载安装* 动手打造史上最简单的 Recycleview 侧滑菜单* TCP网络通讯如何解决分包粘包问题* 程序员的八重境界* 四大线程池详解 最新评论React Native开源项目-嘎嘎商城客户端(持续更新中)

飞同小可: /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 ,...

底部悬停 公司简介|招贤纳士|广告服务|联系方式|版权声明|法律顾问|问题报告|合作伙伴|论坛反馈网站客服杂志客服微博客服webmaster@400-660-0108|北京创新乐知信息技术有限公司 版权所有|江苏知之为计算机有限公司|江苏乐知网络技术有限公司京ICP证09002463号|Copyright © 1999-, , All Rights Reserved

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。