對於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