1. 程式人生 > >Android Demo之旅 ListView底部新增載入更多按鈕實現資料分頁

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

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

  

掌握知識點:

1)自定義Adapter,將資料和ListView繫結起來

2)理解LayoutInflater動態載入xml佈局的用法

3)Handler機制  4)ListView滾動事件

詳細的程式碼大家可以在我的資源中進行下載,下面給大家說一下核心程式碼的實現:

1、我們定義的Activity繼承自ListActivity,我們也可以在xml中定義ListView,然後通過findViewById獲取,初始化:

    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);載入進來,定義我們的按鈕佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

   <Button 
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id="@+id/load"
       android:text="載入更多"/>

</LinearLayout>
然後我們可以通過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<Integer> datas=new ArrayList<Integer>();
        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<Integer> datas;
	private LayoutInflater flater;
	
	//建構函式
	public MyAdapter(List<Integer> 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中,
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <ImageView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/info"/>
    
</LinearLayout>


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<count+10;i++){
    		adapter.addItem(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
 *
 */

相關推薦

Android Demo ListView底部新增載入按鈕實現資料

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

用ajax+jQuery 實現頁面載入(另類的)

這個其實和分頁是起到一樣的效果,只不過有時候在個別場景 個人感覺會比分頁更加靈性一些,萬年不變的分頁看著也是很無聊的。我主要是想把這個功能記錄下,分享給那些初學者。純屬原創,如有不足之處,隨時指教。 先上圖 這個 是我現在做的一個專案,訂單管理頁  本來是做分頁的 但是想

Android複習--ListView中Adapter的使用

在應用程式中,經常會用ListView以列表的方式來顯示資料,那麼下面就開始對ListView進行簡單的介紹。 列表顯示需要三個要素: ListView 介面卡 資料 其中,介面卡是將資料顯示到ListView的橋樑,使用好介面卡是重中之重

AndroidListView下拉重新整理上拉載入效果實現

  在Android開發中,下拉重新整理和上拉載入更多在很多app中都會有用到,下面就是具體的實現的方法。 首先,我們自定義一個RefreshListView來繼承與ListView,下面是程式碼: package com.example.downrefresh; import

Android LRecyclerView實現下拉重新整理,滑動到底部自動載入

                     隨著功能的不斷優化,框架中的類或者介面名字會有變動,為了獲取準確的使用方法,請參考最新的說明文件:點此檢視。簡介LRecyclerView是支援addHeaderView、 addFooterView、下拉重新整理、分頁載入資料的RecyclerView。它對 Rec

android ListView的上部下拉重新整理下部點選載入具體實現及拓展

這次就不上圖了,例子太多太多了,想必大家都見過.這個功能的實現,簡直是開發者必備的. 我也不過多介紹了,網上詳細介紹的部落格太多太多了,若想深入瞭解,請參考網上其他博文. 在這裡,我只是按照自己的理解,模擬實現了一個,順便程式碼貢獻出來. 我對之詳細標明的註釋,想必如果不懂

自定義RecyclerView新增HeaderView,新增FooterView,實現滑動到底部載入

顯示效果圖 PS 接觸過RecyclerView的應該會有個感覺,那就是我不想在使用ListView和GridView了,因為這個控制元件是可以實現那兩個控制元件(ListView和GridView)所實現的幾乎所有吧,哈哈我也沒用他們倆幹過多少的變

Android 列表下拉重新整理上拉載入功能

手機app 列表頁很常用,當資料特別多的時候,為了更好地使用者體驗,需要進行分頁處理。那麼分頁功能怎麼做呢? 看如下核心程式碼 if (mPage == 1 && mList != null) { mList.clear();

ReactNative ListView + 上拉載入 + 下拉重新整理

ListView + 上拉載入更多 + 下拉重新整理 一、內容簡介 ListView列表在添加了上拉載入更多功能之後再新增下拉重新整理 二、程式碼實現 1、引入原生元件 RefreshControl import { ListView, V

自定義ScrollView--下拉重新整理上滑底部自動載入

本文介紹給大家自己寫的一個方便的下拉重新整理上滑載入的自定義ScrollView;直接上乾貨(詳解在程式碼註釋中給出):public class RefreshScrollView extends ScrollView{ /** * 重寫建構函式,這裡不是重

JDBC學習路(八)可滾動結果集和資料

如果在資料庫中有大量資料,然後要求從第150個數據開始讀取,讀10個數據,這種要求在論壇回覆和交流中常見 ,當然了,主流資料庫都提供了指定查詢集的方法,下面我們先來演示一下如果不使用Mysql的查詢集方法怎麼做,當 然,這個在實際開發中應該用處不大,但是作為一種想法還是需要

微信小程式 下拉重新整理/上拉載入 (上拉載入怎麼實現

實現原理: 1、下拉重新整理:由於小程式資料是實時渲染的。我們把data{}內的資料清空重新載入即可實現下拉重新整理。 2、上拉載入更多(頁面上拉觸底事件):新獲取的資料追加到data{}內的原

支付寶賬單分組、重新整理、載入效果實現

          專案中賬單需要做二期優化,支付軟體嘛當然向支付寶看齊了。。分析了下支付的實現,github了一圈最後回到程式碼中,merge了兩個哥們的開源專案【開源就是好】。。 我主要分析一下整個merge的程式碼:    1:定義我們下拉重新整理和上拉載入的類【兩個

載入功能實現

實現點選載入更多按鈕,以及上拉載入更多資料 import React from 'react' import PureRenderMixin from 'react-addons-pure-render-mixin' import { getLis

Android探索(第十四篇)Android實現炫酷效果的Demo(持續收錄中......)

浪起來!使用 drawBitmapMesh 實現模擬水波紋效果 簡書傳送門 三十秒實現QQ首頁動畫特效 BMoveView為RadioGroup新增移動的特

Android探索(第三十七篇)網路動態獲取並載入Selector(Glide篇)

最近公司一個專案選單切換欄需要動態從後臺獲取,於是翻閱了很多資料來去學習這一塊的知識,很多方案很不錯,但並不適合我現在要做的專案,我專案中切換tab的icon是從後臺獲取到的,並且載入選中未選中兩套圖,只允許第一次載入慢,往後就採用快取載入,無延遲,效果圖

Android 學習--Android 體系結構

2015年 1.5 學習 gin 3年 哈哈 蛋糕 名稱 kit 一、Android 背景 背景就不說了,百度介紹很多,主要還是記一下每個Android版本對應的甜品名稱,我覺得這個挺好玩的,哈哈 1.5 Cupcake(紙杯蛋糕):2009年4月30日發布。 1.

Android學習--Android Studio

tro options png 進行 下載 setting 內存 com style 一、開發工具了解 Android Studio 是一個Android集成開發工具,基於IntelliJ IDEA. 類似 Eclipse ADT,提供了集成的 Android 開

Android的DatePicker和TimePicker-android學習(三十八)

cursor ini lis drawable textview @+ type pin view DatePicker和TimePicker簡單介紹 DatePicker和TimePicker是從FrameLayout繼承而來。他們都是比較簡單的組件

11月廣州aNDROID求職

hao123 one ongl android motion cti event roi down MOTIONEVENTaCTION%5FDOWN http://music.hao123.com/songlist/495770244 http://music.baid