android使用SmartRefreshLayout库实现下拉刷新和上拉加载
使用的是一个叫SmartRefreshLayout的第三方库,GitHub地址:https://github.com/scwang90/SmartRefreshLayout#1
在此首先感谢作者。
基本的使用步骤:
1.在 buld.gradle 中添加依赖
compile 'com.android.support:recyclerview-v7:26.1.0'
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.3'
compile 'com.scwang.smartrefresh:SmartRefreshHeader:1.0.3'//没有使用特殊Header,可以不加这行
数据显示使用了recyclerview,所以先添加了recyclerview的依赖
最后一个依赖包含更多样式的Header 根据自己需求添加
2.在XML布局文件中添加 SmartRefreshLayout
<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:background="#fff" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
3.在 Activity 或者 Fragment 中添加代码
RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
}
});
refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
@Override
public void onLoadmore(RefreshLayout refreshlayout) {
refreshlayout.finishLoadmore(2000/*,false*/);//传入false表示加载失败
}
});
以上是官方提供的初始化方法,完成以上步骤即可进行下拉操作看到下拉的效果。下面做一个简单的demo。
可以看到,上面的布局文件中有一个RecyclerView,创建demo实现上/下拉更新RecyclerView中的数据
首先完成上面的1、2步骤。
然后创建好RecyclerView需要的数据类itemBean、适配器MyAdapter和item的样式文件item.xml。
itemBean.class
public class ItemBean {
int itemImage;
String itemTitle;
String itemContent;
public ItemBean(int itemImage , String itemTitle, String itemContent) {
this.itemTitle = itemTitle;
this.itemContent = itemContent;
this.itemImage = itemImage;
}
}
MyAdapter.class
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by hx on 2017/11/7.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private List<ItemBean> mList;
static class ViewHolder extends RecyclerView.ViewHolder{
View myView;
ImageView imageView;
TextView title;
TextView content;
public ViewHolder(View itemView) {
super(itemView);
myView = itemView;
imageView = (ImageView) itemView.findViewById(R.id.iv_image);
title = (TextView) itemView.findViewById(R.id.tv_title);
content = (TextView) itemView.findViewById(R.id.tv_content);
}
}
public MyAdapter(List<ItemBean> list){
this.mList = list;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,null);
final ViewHolder holder = new ViewHolder(view);
return holder;
}
//将数据绑定到控件上
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ItemBean bean = mList.get(position);
holder.imageView.setBackgroundResource(bean.itemImage);
holder.title.setText(bean.itemTitle);
holder.content.setText(bean.itemContent);
}
@Override
public int getItemCount() {
return mList.size();
}
//下面两个方法提供给页面刷新和加载时调用
public void add(List<ItemBean> addMessageList) {
//增加数据
int position = mList.size();
mList.addAll(position, addMessageList);
notifyItemInserted(position);
}
public void refresh(List<ItemBean> newList) {
//刷新数据
mList.removeAll(mList);
mList.addAll(newList);
notifyDataSetChanged();
}
}
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center">
<ImageView
android:id="@+id/iv_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:gravity="center"
android:background="@mipmap/ic_launcher"></ImageView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="30dp"
android:text="title"
android:gravity="center"
></TextView>
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="30dp"
android:text="content1231231231232323"
android:gravity="center"
></TextView>
</LinearLayout>
</LinearLayout>
修改MainActivity.class中的代码
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import com.scwang.smartrefresh.header.MaterialHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.listener.OnLoadmoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<ItemBean> list;
private MyAdapter myAdapter;
private RecyclerView recyclerView;
RefreshLayout refreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
initDate();
setPullRefresher();
}
private void initDate(){
list = new ArrayList<ItemBean>();
for (int i=0;i<20;i++){
list.add(new ItemBean(
R.mipmap.ic_launcher,
"initTitle"+i,
System.currentTimeMillis()+""
));
}
myAdapter = new MyAdapter(list);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);//纵向线性布局
recyclerView.setLayoutManager(layoutManager);
recyclerView.setAdapter(myAdapter);
}
private void setPullRefresher(){
//设置 Header 为 MaterialHeader
refreshLayout.setRefreshHeader(new MaterialHeader(this));
//设置 Footer 为 经典样式
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
//在这里执行上拉刷新时的具体操作(网络请求、更新UI等)
//模拟网络请求到的数据
ArrayList<ItemBean> newList = new ArrayList<ItemBean>();
for (int i=0;i<20;i++){
newList.add(new ItemBean(
R.mipmap.ic_launcher,
"newTitle"+i,
System.currentTimeMillis()+""
));
}
myAdapter.refresh(newList);
refreshlayout.finishRefresh(2000/*,false*/);
//不传时间则立即停止刷新 传入false表示刷新失败
}
});
refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
@Override
public void onLoadmore(RefreshLayout refreshlayout) {
//模拟网络请求到的数据
ArrayList<ItemBean> newList = new ArrayList<ItemBean>();
for (int i=0;i<20;i++){
newList.add(new ItemBean(
R.mipmap.ic_launcher,
"addTitle"+i,
System.currentTimeMillis()+""
));
}
myAdapter.add(newList);
//在这里执行下拉加载时的具体操作(网络请求、更新UI等)
refreshlayout.finishLoadmore(2000/*,false*/);//不传时间则立即停止刷新 传入false表示加载失败
}
});
}
}
这里在刷新时我使用了两个for循环模拟了网络请求到的数据,实际项目中此处应该执行一个网络请求,将请求到的结果赋到newList上作为参数调用refresh或add方法,
finishRefresh方法和finishLoadmore方法分别停止刷新和加载,将他们放到网络请求结束时执行。
以上完成了最基本上拉刷新和下拉加载的功能,更多的属性方法和演示可以看官方提供的文档:
https://github.com/scwang90/SmartRefreshLayout#1