RecyclerView简易底部上拉刷新

本文介绍了如何在RecyclerView中实现底部上拉刷新的功能。通过创建一个基础的RecyclerView,设置Adapter和测试数据,利用Adapter的接口回调监听滑动到底部的事件,从而在Activity中加载更多数据。关键在于控制RecyclerView的getItemViewType来处理加载布局,并在数据中添加一个空项作为加载指示器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值