1. 程式人生 > >ListView分頁展示資料功能一(按鈕方式)

ListView分頁展示資料功能一(按鈕方式)

package com.demo.listviewpageadddatas1;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener {
	public static final String TAG = "MainActivity";
	List<String> items = new ArrayList<String>();
	private ListView listView;
	private int visibleLastIndex = 0; // 最後的可視項索引
	private int visibleItemCount; // 當前視窗可見項總數
	private ListViewAdapter adapter;
	private View loadMoreView;
	private Button loadMoreButton;
	private Handler handler = new Handler();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		/**
		 * 動態載入包含有‘載入更多’按鈕的佈局
		 */
		loadMoreView = getLayoutInflater().inflate(R.layout.load_data, null);
		/**
		 * 從loadMoreView佈局中取出按鈕控制元件
		 */
		loadMoreButton = (Button) loadMoreView
				.findViewById(R.id.loadMoreButton);
		/**
		 * 繫結loadMoreButton按鈕點選事件
		 */
		loadMoreButton.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				/**
				 * 給loadMoreButton按鈕設定文字文字
				 */
				loadMoreButton.setText("正在載入..."); // 設定按鈕文字loading
				/**
				 * handler.postDelayed(runnable, 1000);
				 * 是一個定時器,後面的1000指的是每隔一秒執行一次runnable中的方法 ;
				 * 如果想要關閉此定時器,可以這樣操作handler.removeCallbacks(runnable);
				 */
				handler.postDelayed(new Runnable() {
					@Override
					public void run() {
						Log.d(TAG, "---進入handler.postDelayed()方法");
						loadData();
						adapter.notifyDataSetChanged(); // 資料集變化後,通知adapter
						listView.setSelection(visibleLastIndex
								- visibleItemCount + 1); // 設定選中項
						loadMoreButton.setText("載入更多"); // 恢復按鈕文字
						Log.d(TAG, "---離開handler.postDelayed()方法");
					}
				}, 1000);
			}
		});
		/**
		 * 獲得ListView控制元件物件
		 */
		listView = (ListView) this.findViewById(R.id.listView1);
		/**
		 * 給ListView的最後一個View追加一個View:loadMoreView
		 */
		listView.addFooterView(loadMoreView); // 設定列表底部檢視
		// listView.addHeaderView(v) //設定列表頂部檢視
		initAdapter();
		listView.setAdapter(adapter); // 自動為id是list的ListView設定介面卡
		listView.setOnScrollListener(this); // 新增滑動監聽
		/**
		 * 給ListView的子項繫結點選事件
		 */
		listView.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> arg0, View view,
					int position, long arg3) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), items.get(position),
						Toast.LENGTH_SHORT).show();
			}
		});
	}

	/**
	 * 初始化介面卡
	 */
	private void initAdapter() {
		for (int i = 0; i < 10; i++) {
			items.add("資料_"+(i + 1));
		}
		adapter = new ListViewAdapter(items, this);
	}

	/**
	 * 正在滾動時回撥,回撥2-3次,手指做了拋的動作(手指離開螢幕前,用力滑了一下),回撥三次,否則回撥兩次
	 */
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// 回撥順序如下
		// 第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滾動
		// 第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了拋的動作(手指離開螢幕前,用力滑了一下)
		// 第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滾動
		// 當螢幕停止滾動時為0;當螢幕滾動且使用者使用的觸碰或手指還在螢幕上時為1;
		// 由於使用者的操作,螢幕產生慣性滑動時為2
		Log.d(TAG, "-----進入onScrollStateChanged()方法,scrollState=" + scrollState);
		int itemsLastIndex = adapter.getCount() - 1; // 資料集最後一項的索引
		int lastIndex = itemsLastIndex + 1; // 加上底部的loadMoreView項
		if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
				&& visibleLastIndex == lastIndex) {
			// 如果是自動載入,可以在這裡放置非同步載入資料的程式碼
			Log.i("LOADMORE", "loading...");
			Log.d(TAG, "-----如果是自動載入,可以在這裡放置非同步載入資料的程式碼");
		}
		Log.d(TAG, "-----離開onScrollStateChanged()方法");
	}

	/**
	 * 滾動時一直回撥,直到停止滾動時才停止回撥。單擊時回撥一次。 1.firstVisibleItem:當前能看見的第一個列表項ID(從0開始);
	 * 2.visibleItemCount:當前能看見的列表項個數(小半個也算) ; 3.totalItemCount:列表項共數
	 */
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		Log.d(TAG, "----進入onScroll()方法");
		Log.d(TAG, "----item總數totalItemCount:" + totalItemCount);
		Log.d(TAG, "----visibleItemCount:" + visibleItemCount);
		Log.d(TAG, "----firstVisibleItem:" + firstVisibleItem);
		this.visibleItemCount = visibleItemCount;
		visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
		Log.d(TAG, "----離開onScroll()方法");
	}

	/**
	 * 模擬載入資料
	 */
	private void loadData() {
		int count = adapter.getCount();
		for (int i = count; i < count + 10; i++) {
			adapter.addItem("載入新資料_"+(i + 1));
		}
	}

}

ListViewAdapter.java中程式碼
package com.demo.listviewpageadddatas1;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ListViewAdapter extends BaseAdapter {
	private static Map<Integer, View> m = new HashMap<Integer, View>();

	private List<String> items;
	private LayoutInflater inflater;

	public ListViewAdapter(List<String> items, Context context) {
		super();
		this.items = items;
		this.inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return items.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return items.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View contentView, ViewGroup parent) {
		// TODO Auto-generated method stub
		contentView = m.get(position);
		if (contentView == null) {
			contentView = inflater.inflate(R.layout.listview_item, null);
			TextView text = (TextView) contentView
					.findViewById(R.id.list_item_text);
			text.setText(items.get(position));
		}
		m.put(position, contentView);
		return contentView;
	}

	public void addItem(String item) {
		items.add(item);
	}
}