显示效果图

同步更新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,实现滑动到底部,加载更多...相关推荐

  1. android 刷新某条数据_Android 支持刷新、加载更多、带反弹效果的RecyclerView

    点击上方"Android技术杂货铺",选择"标星" 干货文章,第一时间送达! 开篇 当前市面上很多支持刷新.加载更多RecyclerView开源库,为何我这里还 ...

  2. Android使用RecyclerView实现上拉加载更多,下拉刷新,分组显示

    项目地址:点击打开链接(https://github.com/MrGaoGang/luckly_recyclerview) 使用RecyclerView封装headerview,footerView, ...

  3. 自定义加载更多的Recycleview

    自定义的加载更多的recycleView <span style="font-size:18px;">public class LoadingRecyclerView ...

  4. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  5. 探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

    在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个 ...

  6. RecyclerView的基础使用 +点击添加列表数据 +下拉刷新、上拉加载更多

    一.RecyclerView的基础使用. 第一步:添加recyclerview控件. 第二步:创建布局文件(xml) + 单独的类控制布局里面的控件(MyViewHolder). 第三步:创建一个适配 ...

  7. Android——RecyclerView自定义OnScrollListener实现下拉刷新监听,上拉加载更多功能

    目录 [前言] 1.OnScrollListener滑动事件监听抽象类 2.利用onScrollStateChanged及onScrolled方法实现下拉刷新及上拉加载更多

  8. 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

    原文地址: http://blog.csdn.net/leoleohan/article/details/50989549/ 一.概述 我们公司目前开发的所有Android APP都是遵循iOS风格设 ...

  9. android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

    纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...

  10. 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入

    之前都是采用PullToRefresh进行下拉刷新和下拉加载,现在采用谷歌自己的控件SwipeFreshLayout,配合Recyclerview来实现这一效果.使用SwipeRefreshLayou ...

最新文章

  1. php日期时间戳相互转换,PHP时间戳和日期相互转换
  2. 软件Trimmomatic
  3. 小白视角看ros_openvino_toolkit
  4. sort and uniq
  5. word文档老是出现这个提示-----“发现二义性的名称:TmpDDE”错误
  6. SAP 电商云 Spartacus UI product 明细页面的路由配置
  7. 【项目管理】风险分析
  8. Android应用程序的debug属性
  9. 深入理解ButterKnife源码并掌握原理(一)
  10. linux_安装_SecureCRT下载安装登陆ubuntu配色和文件传输
  11. w ndows7安不上HP1020,1020打印机驱动
  12. 机器学习---黑箱原理
  13. 数独android程序,简单实现Android数独游戏
  14. Google Adsense通过西联快汇收取收入的详细步骤
  15. 小学时的游戏——24点
  16. OpenCV基础应用4.边缘检测
  17. 有关计算机病毒的说法中正确的是,以下有关计算机病毒的说法中,正确的是()。A.计算机病毒是一些人为编制的程序B.计算机病毒具有隐蔽...
  18. 羊了个羊3D版,迄今我见过还原度最佳游戏!还支持微信授权和教程视频
  19. 【渝粤题库】广东开放大学 工程施工组织与设计 形成性考核
  20. 怎么计算机删磁盘下游戏,永远留在硬盘里!PC玩家舍不得删除的经典单机游戏(一)...

热门文章

  1. Dtree 添加 checkbox 复选框 可以默认选中
  2. NSURLConnection实现断点续传
  3. Hibernate的导入和逆向工程生成JavaBean
  4. 如何实现ArcSDE的集群功能
  5. 华为STP相关功能配置
  6. 华为 “OSPF” 认证配置
  7. WLAN通信基础——WLAN物理层通信技术
  8. Arts 第十二周(6/3 ~ 6/9)
  9. 【速转身边开公司的朋友】连加油站都被比特币勒索病毒黑了!还没关闭服务器445端口的抓紧!...
  10. TiDB VS MariaDB10.1.19 Enterprise性能压测