RecyclerView簡易底部上拉刷新

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





發佈了23 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章