对于RecyclerView,想必大家都不会陌生,想到它,也难免会想到ListView呀,GridView呀.当然RecyclerView都具有他们的特点。本文跟大家分享和简易的RecyclerView底部上拉刷新.效果图呢还是这样
1.首先呢,先构建一个基础的RecyclerView,包括 Adapter和一些测试数据,代码就不贴了,大家也都会的
2.Adapter中构建个接口回调,用来监听RecyclerView滑动到底部时,让Activity响应加载数据。
//滑动到底部的监听接口
public interface OnRecyclerBottomListener {
void onRecyclerBottomListener();
}
private OnRecyclerBottomListener onRecyclerBottomListener;
private void setOnRecyclerViewBottomListener(OnRecyclerBottomListener onRecyclerBottomListener){
this.onRecyclerBottomListener = onRecyclerBottomListener;
}
3.那么什么时候才能知道RecyclerView滑动到底部呢?别忘了RecyclerView.Adapter中有这样两个方法
@Override
public void onBindViewHolder(ViewHolder arg0, int arg1) {
// TODO Auto-generated method stub
Log.e("onBindViewHolder", "onBindViewHolder" + arg1);
TextHolder holder = (TextHolder) arg0;
holder.textView.setText(lists.get(arg1));
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
Log.e("onCreateViewHolder", "onCreateViewHolder" + arg1);
View view = LayoutInflater.from(context).inflate(R.layout.item, arg0 , false);
return new TextHolder(view);
}
onCreatViewHolder的话自然就是实例化的xml的东西啦,这个方法在Adapter中只调用了一次,显然这个方法不适合入手。
onBindViewHolder的话是RecyclerView加载Item数据时调用,当Item出现在屏幕中的时候则会被调用,没出现则被回收。所以,比如我项目中有20个Item,屏幕一次性只能加载10个Item,当我加载到10到19Item的时候,再滑一点点,显然会调用到onBindViewHolder,这个时候,我们就可以调用回调接口加载数据啦,只要每次我们把那个底部放在RecyclerView的底部,每次增加数据时只需要插入在他前面就行啦,这就涉及RecyclerView的getItemViewType,来控制加载布局Item了,大致思路就是这样,当然啦,里面还有一些小细节需要注意的。具体如下
4.我们的数据中, //原本20和数据,再加一个空数据表示最后一个显示加载的Item
for (int i = 0; i < 21; i++)
lists.add("测试条目" + i);
adapter = new MyRecyclerViewAdapter(lists, this);
@Override
public void onBindViewHolder(ViewHolder arg0, int arg1) {
// TODO Auto-generated method stub
Log.e("onBindViewHolder", "onBindViewHolder" + arg1);
//如果不是最后一个Item
if (arg1 != lists.size() - 1) {
TextHolder holder = (TextHolder) arg0;
holder.textView.setText(lists.get(arg1));
}else{
//最后一个控件进行的数据操作,就是回调接口,Activity加载数据
if(onRecyclerBottomListener != null)
onRecyclerBottomListener.onRecyclerBottomListener();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
Log.e("onCreateViewHolder", "onCreateViewHolder" + arg1);
// 参数arg1表示getItemViewType里面的返回值
View view = null;
if (arg1 == TAG_BOTTOM)
view = LayoutInflater.from(context).inflate(R.layout.loading, arg0, false);
else
view = LayoutInflater.from(context).inflate(R.layout.item, arg0, false);
return new TextHolder(view);
}
<span style="white-space:pre"> </span>//判断底部
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
// 表示是最后一个
if (position == lists.size() - 1)
return TAG_BOTTOM;
else
return TAG_NORMAL;
}
滑动到最后时,回调接口。Activity中进行数据操作
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0x123){
//进入数据操作,添加到最后一个显示底部的Item之前,adapter.getItemCount() - 1也就是那个底部Item的位置
lists.add(adapter.getItemCount() - 1, new String("哇,我增加进去了耶"));
//执行完lists.add之后,adapter.getItemCount()就已经变化
adapter.notifyItemRangeChanged(adapter.getItemCount() - 1 , adapter.getItemCount() );
}
};
};
Activity代码也贴出来吧,文件下载在下面
package com.example.recyclerviewtest;
import java.util.ArrayList;
import java.util.List;
import com.example.recyclerviewtest.MyRecyclerViewAdapter.OnRecyclerBottomListener;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
public class MainActivity extends ActionBarActivity implements OnRecyclerBottomListener{
private RecyclerView recyclerView;
private MyRecyclerViewAdapter adapter;
private List<String> lists;
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
if(msg.what == 0x123){
//进入数据操作,添加到最后一个显示底部的Item之前,adapter.getItemCount() - 1也就是那个底部Item的位置
lists.add(adapter.getItemCount() - 1, new String("哇,我增加进去了耶"));
//执行完lists.add之后,adapter.getItemCount()就已经变化
adapter.notifyItemRangeChanged(adapter.getItemCount() - 1 , adapter.getItemCount() );
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
private void initData() {
// TODO Auto-generated method stub
lists = new ArrayList<String>();
//原本20和数据,再加一个空数据表示最后一个显示加载的Item
for (int i = 0; i < 21; i++)
lists.add("测试条目" + i);
adapter = new MyRecyclerViewAdapter(lists, this);
//设置底部监听
adapter.setOnRecyclerViewBottomListener(this);
}
//滑动底部后,插入数据,但是数据时要插在最后那个Item的前面
@Override
public void onRecyclerBottomListener() {
// TODO Auto-generated method stub
Log.e("onRecyclerBottomListener", "onRecyclerBottomListener");
//模拟3秒耗时任务
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
handler.sendEmptyMessage(0x123);
}
}, 3000);
}
}
代码量也不多。网络上我也看到过很多关于RecyclerView的底部上拉刷新的,不过我看到的都挺复杂的,不过这里还有个小问题,就是当Item数目没超出屏幕可显示的范围时是一个Bug,晚点修改出来。
下载链接:
http://download.csdn.net/detail/hohohong/9423441