RecyclerView的刷新和加载更多
1.RecyclerView :出现也不知道多久了,没怎么使用过,上次写的笔记乱七八糟的,再次仔细的整理下。
使用需加入依赖
compile 'com.android.support:recyclerview-v7:25.2.0'
2.总结一下内容
<1>可以实现横向滑动
<2>可以实现纵向滑动
<3>可以实现瀑布流
<4>可以实现吸顶模式
<5>加入自定义分割线
<6>实现数据分组效果
3.先实现ListView的效果图,实现下拉刷新,上划加载更多
实现下拉刷新需要借助SwipeRefreshLayout 嵌套在recyclerView的外部
android.support.v4.widget.SwipeRefreshLayout
上划加载更多可以依靠recyclerView的自身监听 addOnScrollListener 当newState==RecyclerView.SCROLL_STATE_IDLE则代表滑动到了底部,然后执行加载 更多的操作。效果图:
4.看实现代码:
布局还有一个recyclerView和SwipeRefreshLayout
<android.support.v4.widget.SwipeRefreshLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/swipeRefreshLayout">
<android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/recyclerView"/>
</android.support.v4.widget.SwipeRefreshLayout>
条目布局一个ImageView和一个textView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="60dp">
<ImageView
android:layout_height="60dp"
android:layout_width="60dp"
android:id="@+id/imageView"
android:scaleType="centerCrop"
android:src="@mipmap/image"/>
<TextView
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center_horizontal|center_vertical"
android:textColor="@color/colorPrimary"
android:id="@+id/textView"/>
</LinearLayout>
adapter继承了RecyclerView.Adapter其泛型为ViewHolder,viewholder继承RecyclerView.ViewHolder。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{ List<String> data;
Context context; public RecyclerViewAdapter(Context context, List<String> data) {
this.context = context;
this.data = data;
} @Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.recycleritem_layout,parent,false);
final ViewHolder holder=new ViewHolder(view);
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
Toast.makeText(context,"点击了第"+position+"个图片",Toast.LENGTH_SHORT).show();
}
});
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getAdapterPosition();
Toast.makeText(context,"点击了第"+position+"个文字条目",Toast.LENGTH_SHORT).show();
}
});
return holder;
} @Override
public void onBindViewHolder(ViewHolder holder, int position) { String s=data.get(position);
holder.textView.setText(s);
} @Override
public int getItemCount() {
return data.size();
} class ViewHolder extends RecyclerView.ViewHolder{ View viewItem;
ImageView imageView;
TextView textView;
public ViewHolder(View itemView) {
super(itemView);
viewItem=itemView;
imageView= (ImageView) itemView.findViewById(R.id.imageView);
textView= (TextView) itemView.findViewById(R.id.textView); }
}
}
在activity中初始了数据,并加载,其中
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
设置了recyclerView的滑动方向为垂直,这里也可以设置为水平方向的滑动。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
RecyclerView recyclerView;
List<String>data=new ArrayList<>();
SwipeRefreshLayout swipeRefreshLayout;
RecyclerViewAdapter recyclerViewAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView= (RecyclerView) findViewById(R.id.recyclerView);
swipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout); for(int i=0;i<15;i++){
data.add("第"+i+"项数据");
} LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager); recyclerViewAdapter=new RecyclerViewAdapter(this,data);
recyclerView.setAdapter(recyclerViewAdapter);
/**
* 刷新
*/
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() { handler.sendEmptyMessageDelayed(100,100);
}
}); /**
* 加载更多
*/
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 这里在加入判断,判断是否滑动到底部
if(newState==RecyclerView.SCROLL_STATE_IDLE){
List<String> dataNew=new ArrayList<>();
for(int i=0;i<30;i++){
dataNew.add("加载更多后第"+i+"项数据");
}
data.addAll(dataNew);
recyclerViewAdapter.notifyDataSetChanged();
}
}
}); } Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); List<String> dataNew=new ArrayList<>();
for(int i=0;i<30;i++){
dataNew.add("刷新后第"+i+"项数据");
}
data.clear();
data.addAll(0,dataNew);
//data.add(0, "下拉刷新出来的数据");
swipeRefreshLayout.setRefreshing(false);
recyclerViewAdapter.notifyDataSetChanged(); }
}; }
5.判断是否滑动到底部
在滑动停止时,判断是否滑动到底部,然后在判断是否需要加载更多
public static boolean isSlideToBottom(RecyclerView recyclerView) {
if (recyclerView == null) return false;
if (recyclerView.computeVerticalScrollExtent() + recyclerView.computeVerticalScrollOffset()
>= recyclerView.computeVerticalScrollRange())
return true;
return false;
}
5.给Recyclerview加上头布局和底部布局。
重新recyclerViewAdapter里面的getItemViewType方法,判断itemview是内容还是头布局或底部布局。
@Override
public int getItemViewType(int position) { if (headeraccount != 0 && position < headeraccount) {
/**
* 头部
*/
return ITEM_TYPE_HEADER;
} else if (footaccount != 0 && position >= (headeraccount + data.size())) { /**
* 尾部
*/
return ITEM_TYPE_BOTTOM;
} else {
/**
* 有效数据
*/ return ITEM_TYPE_CONTENT;
} }
adapter代码:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ List<String> data;
Context context;
int headeraccount=1;
int footaccount=1;
//item类型
public static final int ITEM_TYPE_HEADER = 0;
public static final int ITEM_TYPE_CONTENT = 1;
public static final int ITEM_TYPE_BOTTOM = 2; @Override
public int getItemViewType(int position) { if (headeraccount != 0 && position < headeraccount) {
/**
* 头部
*/
return ITEM_TYPE_HEADER;
} else if (footaccount != 0 && position >= (headeraccount + data.size())) { /**
* 尾部
*/
return ITEM_TYPE_BOTTOM;
} else {
/**
* 有效数据
*/ return ITEM_TYPE_CONTENT;
} } public RecyclerViewAdapter(Context context, List<String> data) {
this.context = context;
this.data = data;
} @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_HEADER) {
return new HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.header_layout, parent, false)); }
if (viewType == ITEM_TYPE_BOTTOM) {
return new HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.header_layout, parent, false)); }
if (viewType == ITEM_TYPE_CONTENT) {
View view = LayoutInflater.from(context).inflate(R.layout.recycleritem_layout, parent, false);
final ContextViewHolder holder = new ContextViewHolder(view);
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
Toast.makeText(context, "点击了第" + position + "个图片", Toast.LENGTH_SHORT).show();
}
});
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = holder.getAdapterPosition();
Toast.makeText(context, "点击了第" + position + "个文字条目", Toast.LENGTH_SHORT).show();
}
});
return holder;
} return null; } @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof HeaderViewHolder){ }else if(holder instanceof FootViewHolder){ }else if(holder instanceof ContextViewHolder){
String s= data.get(position-headeraccount);
((ContextViewHolder) holder).textView.setText(s);
} } @Override
public int getItemCount() {
return data.size()+headeraccount+footaccount;
} class ContextViewHolder extends RecyclerView.ViewHolder{ View viewItem;
ImageView imageView;
TextView textView;
public ContextViewHolder(View itemView) {
super(itemView);
viewItem=itemView;
imageView= (ImageView) itemView.findViewById(R.id.imageView);
textView= (TextView) itemView.findViewById(R.id.textView); }
}
class FootViewHolder extends RecyclerView.ViewHolder{ public FootViewHolder(View itemView) {
super(itemView);
}
}
class HeaderViewHolder extends RecyclerView.ViewHolder{ public HeaderViewHolder(View itemView) {
super(itemView);
}
} }
头布局和底部布局都只是一个imageView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp">
<ImageView
android:layout_height="100dp"
android:layout_width="match_parent"
android:scaleType="centerCrop"
android:src="@mipmap/img"/>
</LinearLayout>
实现效果图:
6.给recyclerView添加item分割线
继承 RecyclerView.ItemDecoration
public class SpacesItemDecoration extends RecyclerView.ItemDecoration{
private int dividerHeight;
private Paint paint;
public SpacesItemDecoration(Context context) {
dividerHeight = context.getResources().getDimensionPixelSize(R.dimen.margin);
paint=new Paint();
paint.setColor(context.getResources().getColor(R.color.colorAccent));
} @Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
/**
* 类似加了一个bottom的padding
*/
outRect.bottom = dividerHeight;
} @Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
int childCount = parent.getChildCount();
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight(); for (int i = 0; i < childCount - 1; i++) {
View view = parent.getChildAt(i);
float top = view.getBottom();
float bottom = view.getBottom() + dividerHeight;
/**
* 绘制的矩形也就是从,item的左上角,到右下角,类似于背景,
* 正好显示出一个横线,就是getItemOffsets空出来的范围
*
*/
c.drawRect(left, top, right, bottom, paint);
}
} }
recyclerView.setAdapter(recyclerViewAdapter);
SpacesItemDecoration decoration=new SpacesItemDecoration(getApplicationContext());
recyclerView.addItemDecoration(decoration);
效果图:
RecyclerView的刷新和加载更多的更多相关文章
- Android之RecyclerView轻松实现下拉刷新和加载更多
今天研究了下RecyclerView的滑动事件,特别是下拉刷新和加载更多事件,在现在几乎所有的APP显示数据列表时都用到了.自定义RecyclerView下拉刷新和加载更多听上去很复杂,实际上并不难, ...
- RecyclerView的下拉刷新和加载更多 动画
下拉刷新和加载更多 1.https://github.com/jianghejie/XRecyclerView 2.http://blog.csdn.net/jabony/article/detail ...
- RecyclerView 下拉刷新和加载更多
一.SwipeRefreshLayout实现下拉刷新 1.方法API: setOnRefreshListener(OnRefreshListener):添加下拉刷新监听器 setRefreshing( ...
- 自己封装的工具类,使用原生SwipeRefreshLayout+RecycleView实现下拉刷新和加载更多
实现SwipeRefreshLayout+RecycleView实现刷新 在你的xml文件里写上如下代码: <android.support.v4.widget.SwipeRefreshLayo ...
- iOS 下拉刷新和加载更多 (OC\Swift)
Swift语言出来之后, 可能还没有第三方的下拉刷新和上提加载, 所以自己用UIRefreshControl控件和UITableView实例的tableFooterView(底部视图)属性结合起来写了 ...
- Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
- Android Demo 下拉刷新+加载更多+滑动删除
小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第 ...
- Android 自定义 ListView 上下拉动刷新最新和加载更多
本文内容 开发环境 演示上下拉动刷新最新和加载更多 ListView 参考资料 本文演示上下拉动,刷新最新和加载更多,这个效果很常见,比如,新闻资讯类 APP,当向下拉动时,加载最新的资讯:向上拉动时 ...
- Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多
在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...
随机推荐
- layui 时间控件 单击 年直接赋值
在 //选中 lay(ul).find('li').on('click', function(){ //结尾处添加 if (options.done === "year") { ...
- Vim 插件管理及安装
1.先将ubuntu1204的软件源进行更新.sudo apt-get update 2.再在终端中敲如下命令,让程序自动安装,根据网速的好坏安装时间有长有短. wget -qO- https://r ...
- MongoDB经典入门(1)--安装
一.前言 最近开始学习非关系型数据库MongoDB,却在博客园上找不到比较系统的教程,很多资料都要去查阅英文网站,效率比较低下.本人不才,借着自 学的机会把心得体会都记录下来,方便感兴趣的童鞋分享讨论 ...
- public static final 的用法
public satic final 修饰后变量的名字全部用大写,定以后可以用类名直接访问,定义的变量不能被修改 所有的接口成员已经是静态,由于接口没有方法所有所以必须先赋值才行,可以直接用接口名调用 ...
- 洛谷P2038 无线网络发射器选址 水题 枚举
刚开始边界写错了(将128写成127). 注意n <= 20,所以可以每读入一个点就将其周边更新,这样最多也只会有 40 * 40 * 20 种位置需要被枚举. Code: #include&l ...
- 在数据表中字段存有excel、word文件数据,让其随着记录指针移动而改变显示
这是一个及其简单的问题,可是被绕住了.当记录移动时,装载数据到excel显示数据.这个方法写在哪里?如何触发? datasource.cds等空间的触发都是多次.到现在也没明白如何去做.笨方法: 1. ...
- redis_1 安装和简单使用
前言: mysql 数据库:数据以“文件形式存储在硬盘”里面.硬盘的存取速度很慢.数据库是一个系统中最占用资源的部分.当sql语句比较复杂(关联的表比较多的时候),每执行一次就会消耗大量的资源.倘若一 ...
- js里写html代码 啥时候要用“\"转义
当去掉\的时候 字体变黑 需要加\
- BA--湿球温度和干球温度的区别
关于湿球温度和干球温度的区别: 干湿球温度表:用一对并列装置的.形状完全相同的温度表,一支测气温,称干球温度表,另一支包有保持浸透蒸馏水的脱脂纱布,称湿球温度表.当空气未饱和时,湿球因表面蒸发需要消耗 ...
- 有关文档碎片(document fragment)的使用方法
通常情况下改动.删除或者添加DOM元素. 更新DOM会导致浏览器又一次绘制屏幕,也会导 致reflow,这样会带来巨大的开销.我们通常解决这的办法尽量降低更新DOM.这也就意 味着将DOM的改变分批处 ...