Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Demo之旅 ListView底部添加加載更多按鈕實現數據分頁

Android Demo之旅 ListView底部添加加載更多按鈕實現數據分頁

編輯:關於Android編程

在我們的實際項目中,數據應該說是很多的,我們的ListView不可能一下子把數據全部加載進來,我們可以當滾動條滾動到ListView的底部的時候,給一個更多的提示,當我們點擊它即加載下一頁的數據,相當與我們的分頁效果,參考網上的東西,寫了一個小小的demo,並總結了一些知識點,功能圖如下:

\ \

源代碼下載地址:http://download.csdn.net/detail/harderxin/7762625

掌握知識點:

1)自定義Adapter,將數據和ListView綁定起來<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+MqOpwO294kxheW91dEluZmxhdGVytq/MrLzT1Nh4bWyyvL7WtcTTw7eoPC9wPgo8cD4zo6lIYW5kbGVyu/rWxiAgNKOpTGlzdFZpZXe59ravysK8/jwvcD4KPHA+z+rPuLXEtPrC67TzvNK/ydLU1NrO0rXE18rUtNbQvfjQ0M/C1NijrM/Cw+a4+LTzvNLLtdK7z8K6y9DEtPrC67XEyrXP1qO6PC9wPgo8cD4xoaLO0sPHtqjS5bXEQWN0aXZpdHm8zLPQ19RMaXN0QWN0aXZpdHmjrM7Sw8fSsr/J0tTU2nhtbNbQtqjS5Uxpc3RWaWV3o6zIu7rzzai5/WZpbmRWaWV3QnlJZLvxyKGjrLP1yry7r6O6PC9wPgo8cD48L3A+CjxwcmUgY2xhc3M9"brush:java;"> public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler=new Handler(); //繼承ListActivity,所以可以用這個方法取得 listView=getListView(); initData(); //添加底部按鈕 View bottomView=getLayoutInflater().inflate(R.layout.bottom, null); loadMore=(Button)bottomView.findViewById(R.id.load); loadMore.setOnClickListener(new ButtonClickListener()); listView.addFooterView(bottomView); //setListAdapter(adapter); listView.setAdapter(adapter); //給listView設置事件 listView.setOnItemClickListener(new OnItemListener()); listView.setOnScrollListener(new OnScrollListener()); }
我們的底部按鈕可以通過listView.addFooterView(View view);加載進來,定義我們的按鈕布局文件:




   
然後我們可以通過View bottomView=getLayoutInflater().inflate(R.layout.bottom, null);獲得View對象,然後通過View對象的findViewById獲得我們的按鈕:loadMore=(Button)bottomView.findViewById(R.id.load);

2)初始化數據,在裡面我們初始化數據為10條,並實例化我們自定義的適配器MyAdapter

    public void initData(){
    	List datas=new ArrayList();
        for(int i=0;i<10;i++){
        	datas.add(i+1);
        }
        adapter=new MyAdapter(datas, this);
    }

3)自定義適配器MyAdapter:ListView在界面初始化或者滾動加載的時候,裡面的getCount、getView等方法會被時時調用執行,每繪制ListView的一行,就會調用getView一次,然後取得相應的組件添加進去;

package com.xin.activity;

import java.util.List;

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

public class MyAdapter extends BaseAdapter{

	private List datas;
	private LayoutInflater flater;
	
	//構造函數
	public MyAdapter(List datas,Context context){
		this.datas=datas;
		flater=LayoutInflater.from(context);
	}
	//得到數據總數
	@Override
	public int getCount() {
		System.out.println("aaa");
		return datas.size();
	}

	//得到每一條數據
	@Override
	public Object getItem(int position) {
		return datas.get(position);
	}

	//得到項目的位置
	@Override
	public long getItemId(int position) {
		return position;
	}

	/**
	 * ListView中所顯示的item都是通過調用Adapter對象的getView方法來得到一個View對象
	 * 然後把這個View對象放在這個item中,這樣的一個過程,這就是ListView和Adapter之間的關系
	 */
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder viewHolder;
		if(convertView==null){
			//生成一個LayoutInflater對象
			//inflater=LayoutInflater.from(context);
			//調用LayoutInflater對象的inflate方法生成一個view對象
			//LayoutInflater 填充器,通過一個xml對象來填充ListView
			//inflate作用:填充一個新的視圖層次結構從指定的XML資源文件中
			//參數:View的layout的ID、生成的層次結構的根視圖
			//return 填充的層次結構的根視圖。如果參數root提供了,那麼root就是根視圖;否則填充的XML文件的根就是根視圖。
			convertView=flater.inflate(R.layout.list, null);
			//生成ViewHolder對象
			viewHolder=new ViewHolder();
			//將convertView中的相關組件賦給ViewHolder中的成員變量
			viewHolder.img=(ImageView)convertView.findViewById(R.id.img);
			viewHolder.info=(TextView)convertView.findViewById(R.id.info);
			//設置tag
			convertView.setTag(viewHolder);
		}else{
			//從convertView中得到我們的viewHolder
			viewHolder=(ViewHolder)convertView.getTag();
		}
		//給viewHolder中的組件添加相應的屬性
		viewHolder.img.setBackgroundResource(R.drawable.ic_launcher);
		viewHolder.info.setText("選項"+datas.get(position));
		return convertView;
	}
	
	//ViewHolder類,保存我們的組件信息,其中的變量值為我們在xml中定義的組件信息,
	//當我們的View通過convertView=flater.inflate(R.layout.list, null);生成出來後
	//我們就可以在convertView取得ViewHolder組件中的相關信息,而不需要重新inflate一遍,減少內存的使用
	class ViewHolder{
		private ImageView img;
		private TextView info;
	}

	//添加數據
	public void addItem(Integer i){
		datas.add(i);
	}
}
ListView中每一行的xml布局:通過convertView=flater.inflate(R.layout.list, null);得到View,然後得到裡面相應的組件一條一條的添加到ListView中,




    
    
    


4)點擊按鈕加載我們的數據,在這裡主要用到的方法是adapter.notifyDataSetChanged();它會通知適配器數據的變化

使用Handler中postDelayed方法,延遲2000毫秒執行裡面的代碼,雖然用到了Runnable類,但是它也是運行在主線程中的,並沒有另外開啟一個線程;

    class ButtonClickListener implements OnClickListener{
		@Override
		public void onClick(View v) {
			loadMore.setText("數據加載中");
			handler.postDelayed(new Runnable() {
				@Override
				public void run() {
					System.out.println("hello");
					loadData();
					adapter.notifyDataSetChanged();
					//listView.setSelection(5);
					loadMore.setText("加載更多");
				}
			}, 2000);
		}
    }
    
    //加載數據
    public void loadData(){
    	int count=adapter.getCount()+1;
    	for(int i=count;i
5)ListView中的事件:

單擊一行事件:

    /**
     * 單擊ListView中某一項觸發的事件
     * @author dell
     *
     */
    class OnItemListener implements OnItemClickListener{
		@Override
		public void onItemClick(AdapterView arg0, View arg1, int position,
				long id) {
			System.out.println("123");
		}
    }
滾動加載事件:

    //是否到達ListView底部
    boolean isLastRow=false;
    /**
     * 滾動時產生的事件
     * @author dell
     *
     */
    class OnScrollListener implements android.widget.AbsListView.OnScrollListener{

    	//滾動的時候一直回調,直到停止滾動時才停止回調,單擊時回調一次
    	//firstVisibleItem:當前嫩看見的第一個列表項ID(從0開始,小半個也算)
    	//visibleItemCount:當前能看見的列表項個數(小半個也算)
    	//totalItemCount:列表項總共數
		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			System.out.println("firstVisibleItem="+firstVisibleItem);
			
			System.out.println("visibleItemCount="+visibleItemCount);
			//判斷是否滾動到最後一行
			if(firstVisibleItem+visibleItemCount==totalItemCount&&totalItemCount>0){
				System.out.println("已經到最後一行了");
				isLastRow=true;
			}
		}

		//正在滾動時回調,回調2-3次,手指沒拋則回調2次,scrollState=2的這次不回調
		//回調順序如下:
		//第一次:scrollState=SCROLL_STATE_TOUCH_SCROLL(1)正在滾動
		//第二次:scrollState = SCROLL_STATE_FLING(2)手指做了拋的動作(手指離開屏幕前,用力滑了一下)
		//第三次:scrollState = SCROLL_STATE_IDLE(0) 停止滾動       
		
		//當屏幕停止滾動時為0;當屏幕滾動且用戶使用的觸碰或手指還在屏幕上時為1;  
        //由於用戶的操作,屏幕產生慣性滑動時為2  
		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			System.out.println("789");
			//當滾動到最後一行並且停止滾動時,執行加載
			if(isLastRow&&scrollState==OnScrollListener.SCROLL_STATE_IDLE){
				//執行加載代碼
				isLastRow=false;
			}
		}
    	
    }

拓展知識點LayoutInflater:

我們在onCreate方法中總會有:setContentView(R.layout.main);出現,其實也可以使用LayoutInflater來加載:

      setContentView(R.layout.main);
        show=(Button)findViewById(R.id.btn);
        //下面的方式和上面的方式是等同的
        //LayoutInflater layoutInflater=LayoutInflater.from(this);
        //View vv=layoutInflater.inflate(R.layout.main, null);
        //setContentView(vv);
        //show=(Button)vv.findViewById(R.id.btn);
區別是:

setContentView()一旦調用, layout就會立刻顯示UI;而inflate只會把Layout形成一個以view類實現成的對象,有需要時再用setContentView(view)顯示出來。

一般在activity中通過setContentView()將界面顯示出來, 但是如果在非activity中如何對控件布局設置操作了,這就需要LayoutInflater動態加載。

LayoutInflater筆記:

/**
* 使用LayoutInflater來動態載入AlertDialog頁面顯示的內容,AlertDialog使用的布局方式在layout目錄下定義的custom_dialog.xml
*
在實際開發中LayoutInflater這個類還是非常有用的,它的作用類似於findViewById()。
不同點是LayoutInflater是用來找res/layout/下的xml布局文件,並且實例化;而findViewById()是找xml布局文件下的具體widget控件(如Button、TextView等)。
具體作用:
1、對於一個沒有被載入或者想要動態載入的界面,都需要使用LayoutInflater.inflate()來載入;
2、對於一個已經載入的界面,就可以使用Activiyt.findViewById()方法來獲得其中的界面元素。
什麼是已經被載入的layout,什麼是還沒有載入的.我們啟動一個應用,與入口Activity相關的layout{常見的是main.xml}就是被載入的,即在Oncreate()中的.
而其他的layout是沒有被載入的.就要動態載入了或通過另一個activity.

LayoutInflater作用是將layout的xml布局文件實例化為View類對象。
獲取LayoutInflater的方法有如下三種:
LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.main, null);
LayoutInflater inflater = LayoutInflater.from(context); (該方法實質就是第一種方法,可參考源代碼)
View layout = inflater.inflate(R.layout.main, null);
LayoutInflater inflater = getLayoutInflater();(在Activity中可以使用,實際上是View子類下window的一個函數)
View layout = inflater.inflate(R.layout.main, null);
注意:
·inflate方法與 findViewById 方法不同;
·inflater 是用來找 res/layout下的 xml 布局文件,並且實例化;
·findViewById() 是找具體 xml 布局文件中的具體 widget 控件(如:Button、TextView 等)。
* @author dell
*
*/

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