欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

[Android]自定义ListView:上拉加载更多

来源: 开发者 投稿于  被查看 45732 次 评论:155

[Android]自定义ListView:上拉加载更多


上拉刷新,即当ListView滚动到底部的时候,再继续拉取的时候,将出现一个提示告诉你正在加载数据,稍后提示消失,新的数据出现。

在这里,我提供一个想法:ListView自带方法中具有添加尾部布局的方法,这样的话,当我们监听到拉到最后的时候,出现尾部布局并加载新的数据,等加载完后,更新ListView的中的数据,那些数据将自动把尾部布局压在底下看不到。如此反复,便可以实现上拉加载更多的功能。

思路有了,开始思考需要怎么一步步实现:

a)创建自定义ListView

b)为ListView添加底部布局

c)为ListView添加底部监听

d)实现ListView滑到底部时所要执行的用户操作

 

a)创建一个MyPullUpListView类,并且继承ListView,再次同时实现其构造方法:

 

	public MyPullUpListView(Context context) {
		super(context);
	}

	public MyPullUpListView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

 

b)首先在其layout中创建一个尾部布局,例如:

 




    


\

 

其中,在加入底部布局的代码为:

 

	/**
	 * 初始化话底部页面
	 */
	public void initBottomView() {

		if (footerView == null) {
			footerView = LayoutInflater.from(this.context).inflate(
					R.layout.listview_loadbar, null);
		}
		addFooterView(footerView);
	}

 

c)为ListView添加滑到监听,便是实现OnScrollListener接口,并实现以下方法:

 

	public void onScrollStateChanged(AbsListView view, int scrollState) {

		//当滑动到底部时
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
				&& firstVisibleItem != 0) {
		}
	}

	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		this.firstVisibleItem = firstVisibleItem;
		
		if (footerView != null) {
			//判断可视Item是否能在当前页面完全显示
			if (visibleItemCount == totalItemCount) {
				// removeFooterView(footerView);
				footerView.setVisibility(View.GONE);//隐藏底部布局
			} else {
				// addFooterView(footerView);
				footerView.setVisibility(View.VISIBLE);//显示底部布局
			}
		}

	}


 

d)要实现ListView滑到底部时所要执行的用户操作,此时,则需要一个回调接口:

 

	/**
	 * 上拉刷新的ListView的回调监听
	 * 
	 * @author xiejinxiong
	 * 
	 */
	public interface MyPullUpListViewCallBack {

		void scrollBottomState();
	}

使用回调接口的地方:

 

 

	public void onScrollStateChanged(AbsListView view, int scrollState) {

		//当滑动到底部时
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
				&& firstVisibleItem != 0) {
			myPullUpListViewCallBack.scrollBottomState();
		}
	}

大致实现代码就是如上所示了,由于其使用还是需要一点格式的,以下给出其使用格式:

 

 

		myListView = (MyPullUpListView) this.findViewById(R.id.mylist);
		myListView.initBottomView();
		myListView.setAdapter(listViewAdapter);
		myListView.setMyPullUpListViewCallBack(new MyPullUpListViewCallBack() {

			public void scrollBottomState() {
				// TODO Auto-generated method stub
				····
			}
		});

效果图:

 

\

为方便学习者参考,以下附上完整自定义ListView代码:

 

package com.xiaoyan.xiaoyanlibrary.common.widget.listview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

import com.xiaoyan.xiaoyanlibrary.R;

/**
 * 上拉刷新ListView
 * 
 * @author xiejinxiong
 * 
 */
public class MyPullUpListView extends ListView implements OnScrollListener {

	/** 底部显示正在加载的页面 */
	private View footerView = null;
	/** 存储上下文 */
	private Context context;
	/** 上拉刷新的ListView的回调监听 */
	private MyPullUpListViewCallBack myPullUpListViewCallBack;
	/** 记录第一行Item的数值 */
	private int firstVisibleItem;

	public MyPullUpListView(Context context) {
		super(context);
		this.context = context;
		initListView();
	}

	public MyPullUpListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		initListView();
	}

	/**
	 * 初始化ListView
	 */
	private void initListView() {

		// 为ListView设置滑动监听
		setOnScrollListener(this);
		// 去掉底部分割线
		setFooterDividersEnabled(false);
	}

	/**
	 * 初始化话底部页面
	 */
	public void initBottomView() {

		if (footerView == null) {
			footerView = LayoutInflater.from(this.context).inflate(
					R.layout.listview_loadbar, null);
		}
		addFooterView(footerView);
	}

	public void onScrollStateChanged(AbsListView view, int scrollState) {

		//当滑动到底部时
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
				&& firstVisibleItem != 0) {
			myPullUpListViewCallBack.scrollBottomState();
		}
	}

	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		this.firstVisibleItem = firstVisibleItem;
		
		if (footerView != null) {
			//判断可视Item是否能在当前页面完全显示
			if (visibleItemCount == totalItemCount) {
				// removeFooterView(footerView);
				footerView.setVisibility(View.GONE);//隐藏底部布局
			} else {
				// addFooterView(footerView);
				footerView.setVisibility(View.VISIBLE);//显示底部布局
			}
		}

	}

	public void setMyPullUpListViewCallBack(
			MyPullUpListViewCallBack myPullUpListViewCallBack) {
		this.myPullUpListViewCallBack = myPullUpListViewCallBack;
	}

	/**
	 * 上拉刷新的ListView的回调监听
	 * 
	 * @author xiejinxiong
	 * 
	 */
	public interface MyPullUpListViewCallBack {

		void scrollBottomState();
	}
}


 

 

用户评论