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 ...
随机推荐
- zmodem使用方法
无论有xshell还是secureCRT连接linux的时. 默认都用一个zmodem可以帮助window和linux之间传输文件 很方便和实用的工具. 不过默认是无法使用的 需要安装lrzsz软件 ...
- ML:流形学习
很多原理性的东西需要有基础性的理解,还是篇幅过少,所以讲解的不是特别的清晰. 原文链接:http://blog.sciencenet.cn/blog-722391-583413.html 流形(man ...
- C++序列化使用
error C2248 无法访问私有成员 :原因 ifstream 作为参数必须传引用! (1):C++使用STL序列化:原文链接:http://blog.csdn.net/pandaxcl/arti ...
- 离线安装ADT和sdk
重装Eclipse.离线安装ADT.Android SDK 由于最新的ADT.Android SDK需要最新版本的Eclipse才能使用,我无奈的只好升级Eclipse.看看自己的Eclipse已经两 ...
- Linux系统编程@进程管理(一)
课程目标: 构建一个基于主机系统的多客户即时通信/聊天室项目 涉及的理论知识 进程控制:僵尸进程/孤儿进程.进程控制.守护进程... 进程间通信:管道.命名管道.信号... 多线程编程: 锁.信号量. ...
- Python数据分析-----数据分类
1.常见的分类算法主要有: (1)KNN算法 (2)贝叶斯方法 (3)决策树 (4)人工神经网络 (5)支持向量机(SVM) 2.KNN算法 (1)KNN应用场景: 比方说样本中有很多零食.很多电器. ...
- nyoj25-A Famous Music Composer
A Famous Music Composer 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 Mr. B is a famous music composer. One ...
- 【hiho一下 第九周】 状态压缩·二
[题目链接]:http://hihocoder.com/problemset/problem/1048 [题意] [题解] 按从左到右然后从上到下的顺序; 依次枚举每个格子是竖条还是横条; 然后在搜索 ...
- 启动 Appium 自带模拟器
1.先在sclipse中新建并打开一个设备 2.启动appium 3.安装apk 打开cmd 并在sdk安装目录的tools文件夹下输入安装命令adb install xxx.apk(在这之前需要把 ...
- BJFU 质数相关
/* BJFU 质数相关 http://101.200.220.237/contest/19/problem/116/ 二分图 按质因数奇偶性建立二分图 * * */ #include <cst ...