Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> [Android]自定義ListView:上拉加載更多

[Android]自定義ListView:上拉加載更多

編輯:關於Android編程

上拉刷新,即當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();
	}
}


 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved