Android开发--上拉加载更多ListView实现

         基于现如今的大数据时代,大量的网络数据不可能一次性在客户端全部加载,于是我们总是每次加载一部分数据,当ListView滑动到底部时自动进行加载更多,由于使用比较频繁,想着把这个控件进行一个封装,以后可以方便使用。

         主要思路:第一步重写自己的类继承ListView,然后为我们自己的ListView添加一个footer来表示滑动到底部时的提示,最后在OnScrollListener中进行判断是否滑动到底部,若此时滑动到底部,并且没有正在加载则执行加载方法。接下来代码实现:

         1.重写自己的View并添加一个footer

        public AutoLoadListView(Context context) {
		super(context);
		initView(context);
	}

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

	public AutoLoadListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context);
	}

	// 初始化组件
	private void initView(Context context) {
		inflater = LayoutInflater.from(context);
		footer = inflater.inflate(R.layout.listview_footer, null);
		loadFull = (TextView) footer.findViewById(R.id.footer_loadFull);
		loadFail = (TextView) footer.findViewById(R.id.footer_noData);
		loadIng = (TextView) footer.findViewById(R.id.footer_more);
		progressBar = (ProgressBar) footer.findViewById(R.id.footer_loading);

		addFooterView(footer);
		setOnScrollListener(this);//设置滑动监听事件
	}
              2.写一个回调接口来执行自动加载的方法
	// 加载更多监听
	public void setOnLoadListener(OnLoadListener onLoadListener) {
		mOnLoadListener = onLoadListener;
	}

	public interface OnLoadListener {
		public void onLoad();
	}
              3.在OnScrollListener中判断是否滑动到底部,
        @Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		if (!isLoading && view.getLastVisiblePosition() == view.getCount() - 1) {
			isLoading = true;
			setloading();
			if (mOnLoadListener != null) {
				mOnLoadListener.onLoad();
			}
		}
	}
               注意:因为我们添加了一个footer,所以滑动到最低部的判断条件为view.getLastVisiblePosition() == view.getCount() - 1,需要对总数减一

               4.给出当加载结束后需要调用的方法,重置isLoading的值,和footer的显示

	// 用于加载更多结束后的回调
	public void onLoadComplete() {
		isLoading = false;
		setLoadFull();
	}

	// 加载失败时footer显示
	public void setLoadFailed() {
		loadIng.setVisibility(View.GONE);
		loadFull.setVisibility(GONE);
		progressBar.setVisibility(GONE);
		loadFail.setVisibility(VISIBLE);
	}

	// 加载完成时footer显示
	public void setLoadFull() {
		loadIng.setVisibility(View.GONE);
		loadFull.setVisibility(VISIBLE);
		progressBar.setVisibility(GONE);
		loadFail.setVisibility(GONE);
	}

	// 正在加载时footer显示
	private void setloading() {
		loadIng.setVisibility(View.VISIBLE);
		loadFull.setVisibility(GONE);
		progressBar.setVisibility(VISIBLE);
		loadFail.setVisibility(GONE);
	}
附上总体源码:
package com.example.test;

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 android.widget.ProgressBar;
import android.widget.TextView;

public class AutoLoadListView extends ListView implements OnScrollListener {

	private static final String TAG = "AutoLoadListView";

	private LayoutInflater inflater;
	private View footer;

	private TextView loadFail;
	private TextView loadFull;
	private TextView loadIng;
	private ProgressBar progressBar;

	private boolean isLoading;// 判断是否正在加载

	private OnLoadListener mOnLoadListener;

	public AutoLoadListView(Context context) {
		super(context);
		initView(context);
	}

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

	public AutoLoadListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context);
	}

	// 初始化组件
	private void initView(Context context) {
		inflater = LayoutInflater.from(context);
		footer = inflater.inflate(R.layout.listview_footer, null);
		loadFull = (TextView) footer.findViewById(R.id.footer_loadFull);
		loadFail = (TextView) footer.findViewById(R.id.footer_noData);
		loadIng = (TextView) footer.findViewById(R.id.footer_more);
		progressBar = (ProgressBar) footer.findViewById(R.id.footer_loading);

		addFooterView(footer);
		setOnScrollListener(this);
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		if (!isLoading && view.getLastVisiblePosition() == view.getCount() - 1) {
			isLoading = true;
			setloading();
			if (mOnLoadListener != null) {
				mOnLoadListener.onLoad();
			}
		}
	}

	// 用于加载更多结束后的回调
	public void onLoadComplete() {
		isLoading = false;
		setLoadFull();
	}

	// 加载失败时footer显示
	public void setLoadFailed() {
		loadIng.setVisibility(View.GONE);
		loadFull.setVisibility(GONE);
		progressBar.setVisibility(GONE);
		loadFail.setVisibility(VISIBLE);
	}

	// 加载完成时footer显示
	public void setLoadFull() {
		loadIng.setVisibility(View.GONE);
		loadFull.setVisibility(VISIBLE);
		progressBar.setVisibility(GONE);
		loadFail.setVisibility(GONE);
	}

	// 正在加载时footer显示
	private void setloading() {
		loadIng.setVisibility(View.VISIBLE);
		loadFull.setVisibility(GONE);
		progressBar.setVisibility(VISIBLE);
		loadFail.setVisibility(GONE);
	}

	// 加载更多监听
	public void setOnLoadListener(OnLoadListener onLoadListener) {
		mOnLoadListener = onLoadListener;
	}

	public interface OnLoadListener {
		public void onLoad();
	}

}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值