Android Demo之旅 ListView底部添加載入更多按鈕實現資料分頁

來源:互聯網
上載者:User

Android Demo之旅 ListView底部添加載入更多按鈕實現資料分頁

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


原始碼:http://download.csdn.net/detail/harderxin/7762625

掌握知識點:

1)自訂Adapter,將資料和ListView綁定起來<喎?http://www.bkjia.com/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);}//得到資料總數@Overridepublic int getCount() {System.out.println("aaa");return datas.size();}//得到每一條資料@Overridepublic Object getItem(int position) {return datas.get(position);}//得到項目的位置@Overridepublic long getItemId(int position) {return position;}/** * ListView中所顯示的item都是通過調用Adapter對象的getView方法來得到一個View對象 * 然後把這個View對象放在這個item中,這樣的一個過程,這就是ListView和Adapter之間的關係 */@Overridepublic 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);//設定tagconvertView.setTag(viewHolder);}else{//從convertView中得到我們的viewHolderviewHolder=(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{@Overridepublic void onClick(View v) {loadMore.setText("資料載入中");handler.postDelayed(new Runnable() {@Overridepublic 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{@Overridepublic 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:清單項目總共數@Overridepublic 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  @Overridepublic 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
*
*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.