自定义Recycler上拉加载刷新 谁都看得懂
2018-10-02 本文已影响6人
wishes丶啊
看懂本文需要对RecyclerView和RecyclerAdapter的基本使用有了解。也就是会用就行。
效果就是滑动最下面的item,就加载更多数据,并且最后一个item跟普通的item不一样。
![](https://img.haomeiwen.com/i8909836/4d6d31c838597511.png)
会判断是否显示到了最后一个,进行数据加载
为了缩短篇幅,下面两个代码没有给出
1.item布局简单,就是一个TextView,分别是R.layout.cell_string和R.layout.cell_load
2.两个ViewHolder代码也简单,里面也只有一个TextView对象
首先准备recyclerAdapter,名字就叫StringAdapter
public class StringAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// 这个item分为两种 一种是正常显示数据的item,一种是显示“正在加载”的item
public static final int NORMAL_ITEM = 1; // 正常显示数据的item
public static final int LOADER_ITEM = 2; // "正在加载" 的 item
List<String> mData;
// 用构造方法赋值
public StringAdapter(List<String> strings){
this.strings = strings;
}
@Override
public int getItemCount() {
// 因为除了显示基本的数据外 还需要添加一个显示“正在加载”的item,所以要+1
return strings.size() + 1;
}
// 重要 这是RecyclerView.Adapter的一个方法,返回值就作为onCreateViewHolder的第二个参数
@Override
public int getItemViewType(int position) {
if (position == strings.size()) { // 如果是最后一个item 就显示“正在加载”的item
return LOADER_ITEM;
}
return NORMAL_ITEM; // 正常情况下 显示普通的item
}
/**
* 第二个参数就是上面方法(getItemViewType)返回的
* 这个方法的作用是返回一个ViewHolder 用来显示
*/
@Override
public RecyclerView.ViewHolderon CreateViewHolder(ViewGroup parent,int viewType) {
Context context=parent.getContext(); //获取上下文
LayoutInflater inflater = LayoutInflater.from(context);
// 根据不同的viewType来返回不同的ViewHolder,从而显示不同的Item
if (viewType == NORMAL_ITEM) { // 正常的item
View view = inflater.inflate(R.layout.cell_string, parent, false);
return new StringHolder(view); // 使用正常的Holder
} else { // “正在加载” item
View view = inflater.inflate(R.layout.cell_load, parent, false);
return new LoadHolder(view); // 使用 “正在加载”的Holder
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
// 我们只返回了两种ViewHolder 分别进行不同的操作
if (holder instanceof StringHolder) {
String s = strings.get(position); // 从集合中获取数据然后显示
((StringHolder) holder).textView.setText(s);
} else if (holder instanceof LoadHolder) {
((LoadHolder) holder).textView.setText("正在加载哦...");
}
}
}
ViewHolder很简单,其中都只有一个TextView
接下来看RecyclerView的初始化
public class MainActivity extends Activity{
private int lastVisiableItem; //当前RecyclerView的最下面一个可见的Item位置
@Override
protected void onCreate(Bundle savedInstanceState) {
//...此处省略无关代码
RecyclerView recyclerView=findViewById(R.id.recycler);
// 设置LayoutManager之后要使用
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
StringAdapter adapter=new StringAdapter(list);
recyclerView.setAdapter(adapter);
// 以上都是基本操作 重点看下面的代码 给recyclerView添加滑动事件监听
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
/**
* 当RecyclerView滑动状态改变时会回调此方法
* newState就是当前状态 分别有三种
*/
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// new Sate的状态
// RecyclerView.SCROLL_STATE_IDLE: 滑动已经停止
// RecyclerView.SCROLL_STATE_DRAGGING: 在手指的操作下滑动
// RecyclerView.SCROLL_STATE_SETTLING: 在惯性的作用下滑动
// 当RecyclerView停止在最后一个Item(LoadViewHodler)时,要加载数据
if(newState==RecyclerView.SCROLL_STATE_IDLE &&
lastVisibleItem+1==adapter.getItemCount()){
// 这样条件成立的情况下就是显示了最后一个"正在加载"的ViewHolder
// TODO 此处可以进行数据加载等各种操作
}
}
/**
* RecyclerView一滑动就回调此方法 我们可以在这个方法里面获取
* RecyclerView最后一个显示Item的位置
*/
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// 获取最后一个可见的item
lastVisibleItem = layoutManager.findLastVisibleItemPosition();
}
});
}
}
这样就可以监听是否滑倒最后一个item了。可以按照需求进行具体的操作。