1. 程式人生 > >Android ListView實現分頁顯示資料

Android ListView實現分頁顯示資料

當有大量的資料需要載入到ListView的Adapter中時,全部一次性載入,通常會非常耗時,這將嚴重影響使用者的體驗性和流暢性,而分頁載入則會優化載入的速度,先暫時顯示一頁能夠顯示的資料項,在拖動到最下方時或點選了“顯示更多”按鈕時,再載入部分(需要自己定義每次顯示多少)資料項。

而且此項技術,會在以後的運用中比較常用的使用到。

步驟一:設計主介面佈局

mail.xml

<?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="vertical" >

    <ListView
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout> 

為了測試,介面比較簡單,就一個ListView。

步驟二:設計Adapter中每一項Item的佈局

items.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/bigtext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="15pt"
        />
    
    <TextView
        android:id="@+id/smalltext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/bigtext"
        android:textSize="7pt"
        />

</RelativeLayout>

也是比較簡單,就是兩個TextView相對上下顯示

步驟三:(重要)在Activity裡設計程式碼

ShowItemsByPage.java

下面是定義的變數和onCreate函式

private ListView mListView = null;
	private SimpleAdapter adapter = null;
	private ArrayList<Map<String, String>> dataList = null;
	private final int maxShowItems = 100;	// 最多的載入項數目
	private final int stepShowItems = 10;	// 每次載入的數目
	private int lastShowItem = 0;			// 最後載入的專案
	private Handler mHanlder = null;		// 控制釋出訊息佇列
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mListView = (ListView)findViewById(R.id.listview);
        dataList = new ArrayList<Map<String, String>>();
        mHanlder = new Handler();

        for(int i=0; i<10; i++)
        {
        	HashMap<String, String> map = new HashMap<String, String>();
        	map.put("big", "大字型載入第" + i + "個選項");
        	map.put("small", "小字型載入第" + i + "個選項");
        	dataList.add(map);
        }
        
        // 設定ListView的Adapter
        adapter = new SimpleAdapter(this, dataList, R.layout.items, new String[]{"big", "small"}, new int[]{R.id.bigtext, R.id.smalltext});
        mListView.setAdapter(adapter);
        
        mListView.setOnScrollListener(new mOnScrollListener());
    }
在onCreate方法中,初始化了ListView、需要載入的ArrayList-->dataList、控制傳送runnable訊息的mHandler,

在for迴圈中,為了配合模擬器的顯示,顯式的要求初始時只先顯示10個選項。

在for迴圈裡,每次都定義一個HashMap物件,載入兩個文字。

下面是loadData方法

public void loaddata()
    {
    	int curCount = mListView.getAdapter().getCount();
    	Log.i("carter", "當前Adapter的數量為: " + curCount);
    	
    	if( (curCount+stepShowItems)<=maxShowItems )
    	{
    		for(int i=curCount; i<(curCount+stepShowItems); i++)
    		{
    			HashMap<String, String> map = new HashMap<String, String>();
    			map.put("big", "大字型載入第" + i + "個選項");
            	map.put("small", "小字型載入第" + i + "個選項");
            	dataList.add(map);
    		}
    	}
    	else
    	{
    		for(int i=curCount; i<maxShowItems; i++)
    		{
    			HashMap<String, String> map = new HashMap<String, String>();
    			map.put("big", "大字型載入第" + i + "個選項");
            	map.put("small", "小字型載入第" + i + "個選項");
            	dataList.add(map);
    		}
    	}
    }

這個函式主要是載入分頁的資料項到ArrayList中

首先從Adapter中獲取當前已經載入的資料項數目curCount,接下來的判斷中,如果當前資料項curCount加上每次遞進的資料項數目stepShowItems小於等於最大能載入的資料項數目maxShowItems,則把下一頁的stepShowItems個數據項加入到ArrayList中,如果超過了maxShowItems,則只把剩餘的幾項加入到ArrayList中

下面是實現了android.widget.AbsListView.OnScrollListener介面的mOnScrollListener類

private class mOnScrollListener implements OnScrollListener
    {

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// TODO Auto-generated method stub
			
			Log.i("carter", "onScroll");
//這裡的算數邏輯可能有問題,請自行思考
			lastShowItem = firstVisibleItem + visibleItemCount;
			Log.i("carter", "lastShowItem = " + lastShowItem);
			Log.i("carter", "visibleItemCount = " + visibleItemCount);
			
			if(lastShowItem == maxShowItems)
			{
				Toast.makeText(ShowItemsByPages.this, "載入完成", Toast.LENGTH_SHORT).show();
			}
		}

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			// TODO Auto-generated method stub
			Log.i("carter", "onScrollStateChanged");
			
			Log.i("carter", "scrollState = " + scrollState);
			Log.i("carter", "adapter count = " + mListView.getAdapter().getCount());
			
			if( (OnScrollListener.SCROLL_STATE_IDLE==scrollState) && 
					(lastShowItem==(mListView.getAdapter().getCount())) )
			{
				ShowItemsByPages.this.mHanlder.post(new Runnable(){
					public void run()
					{
					ShowItemsByPages.this.loaddata();
 ShowItemsByPages.this.adapter.notifyDataSetChanged();
					}
				});
			}
		}
	}

mOnScrollListener實現了OnScrollListener介面,必須實現onScroll和onScrollStateChanged方法。

在onScroll方法中,通過方法自帶的兩個引數firstVisibleItem和visibleItemCount的和計算出當前顯示的最後一個數據項lastShowItem,如果最後一個數據項等於最大能顯示的資料項時,則說明已經全部加在完成了,彈出提示

在onScrollStateChanged方法中,主要完成拖動到列表最下方自動加在下一頁資料項的功能。通過判斷當前拖動的狀態,和最後顯示項和adapter顯示項的判斷,來確定是否載入下一頁。如果可以載入,則用Handler的post一個Runnable到訊息佇列,通過loadData把資料項載入到ArrayList中,在通過Adapter的notifyDataSetChanged方法,重新載入資料項。

至此,就可以完成這個分頁顯示的功能了。

相關推薦

Android ListView實現顯示資料

當有大量的資料需要載入到ListView的Adapter中時,全部一次性載入,通常會非常耗時,這將嚴重影響使用者的體驗性和流暢性,而分頁載入則會優化載入的速度,先暫時顯示一頁能夠顯示的資料項,在拖動到最下方時或點選了“顯示更多”按鈕時,再載入部分(需要自己定義每次顯示多少)

listview實現載入資料的注意點

/**  * 未讀資訊list  */ public class MessageSecondLayerActivity extends Activity implements View.OnClickListener {     private ListView listView;     private L

android ListView 動態載入資料

 用ListView顯示資料時,列表中資料量大時,載入和處理時間會明顯變長,如果等到把所有資料都處理載入完成再顯示出來,那程式的UI就非常糟糕了,很可能會隨資料量的變大而變慢,這樣的介面很不友好,我們無法接受。  廢話說完了,那怎麼解決這個的問題呢?  動態載入,分頁載

例項:建立一個表格,顯示資料(MongoDB資料庫儲存),功能:實現增刪改查

需求:建立一個表格,分頁顯示資料,功能:實現增刪改查 效果圖: 自動建立一個專案 命令列: express mongodb-demo --view=ejs cd mongodb-demo npm install npm install mongodb --save npm sta

前臺jsp獲取後臺查詢的結果集資料實現顯示

前臺獲取後臺查詢的結果並分頁顯示。 1、使用ajax非同步請求,傳送post請求到url,獲取結果引數data(data被dao層處理成json物件返回) 2、返回的結果: 在dao處理後(根據userId查詢結果集)向service返回的結果,是一個json物件:re

python 實現顯示從es中獲取的資料

注意:使用該方法,獲取的資料總數目不能超過1萬,否則出錯 #在python3上執行 from elasticsearch import Elasticsearch from urllib3.connectionpool import xrange def get_pag

EasyUI結合Sqlserver資料庫實現一個顯示資料

EasyUI大多數會被用在做後臺的美化,以及資料的展示。今天是六一兒童節,祝各位程式設計師們,兒童節快樂哈!話不多說,我們開始正題。先來看看我們這個小案例的專案目錄:App_Data中的四個檔案是博主為了方便檢視專案把他放在一起。步驟一:我們編寫了資料庫指令碼.sql檔案,在

ListView實現功能

ryu uem col events dac com 引入 fct ole 1.ViewPager實現Tab 目錄結構: 主布局文件: activity_main.xml 引入頭,尾,中間區域是一個ViewPager 頂部與底部文件寫固定高度,中間View

ssm框架整合入門系列——查詢-顯示資料

ssm框架整合入門系列——查詢-分頁顯示資料(pageHelper的使用) 查詢也就是顯示操作,在該專案下具體表現為: 訪問index.jsp頁面 index.jsp頁面傳送出查詢員工列表請求 EmployeeController 來接受請求,查出員工資料 來到list.jsp頁面進

後臺管理實現顯示----核心物件

需求 實現簡單的分頁管理資料的頁面功能,類似下面 採用物理分頁方式:即每開啟一頁都互動從後臺取回需要頁資料 同時也有邏輯分頁方式,就是一次互動,後臺把所有的所有頁面資料一起發過來,前端自己分頁顯示。雖互動簡單,但也不沒了實時性,不提倡。 解決方法 物

Spring boot顯示資料(1)

spring boot分頁顯示資料(1) 記錄一下~ 我們從簡入繁,先使用一種通過頁面重新整理來實現分頁資料展示的方法~ 下面是一個簡單的栗子 使用工具:spring-data-jpa,thymeleaf 實體類: 實體類中不要忘記定義空的構造方法哦~

JSP頁面顯示資料

一、原始碼(這裡以一個Java web的留言板專案為例): 1.Dao層操作資料庫的方法(MessageDao.java) 設定每頁顯示的最大留言條數: private final int MAX_SIZE = 2; // 每頁顯示的最大留言數 從資料庫讀取留言的總

jsp實現顯示資訊(資料庫、EL表示式、連線池)

一、準備工作 1.1在mysql資料庫中你建立學生的表 1.2細節: 1.2.0. 先匯入musql的jar包 1.2.1. 性別一般用列舉型 1.2.2. 要將錶轉儲sql檔案,放在web專案額web-info下面

Web顯示資料

這個是基於MVC框架寫的。 首先對資料庫進行封裝處理 public class DataBase { static String driver = "com.mysql.jdbc.Driver"; static String url =

servlet+mvc實現顯示列表

實現分頁顯示有好多種方法,有客戶端顯示的用JS,有服務端分頁的。在此我對服務端的分頁功能進行敘述 先展示下我的專案的目錄結構: 標準的MVC模式,現在我的分頁步驟是從jsp呼叫servlet,通過servlet呼叫對應的service類,service類

配置與使用displaytag實現顯示

1--- 到displaytag 官網()上下載最新的元件,解壓壓縮包得到displaytag-1.2.jar檔案(displaytag-examples-1.2.war檔案是專案檔案可以直接放在tomcat的webapps目錄下直接執行),將displaytag-1.2.j

基於Jquery+Ajax+Json實現顯示

1.後臺action產生json資料。 List blackList = blackService.getBlackInfoList(mobileNum, gatewayid, startDate, endDate); int totalRows = blackList.

jsp實現顯示時session區分重定向與轉發的區別

當我們使用session實現頁面分頁顯示記錄時,應當注意RequestDispatcher dispatcher=request.getRequestDispatcher("byPageShow.jsp");dispatcher.forward(request, respon

Django 實現顯示

總體思路: 從資料庫取出資料,根據事先定義的每頁顯示的數量,進行分頁計算,得到頁數,構造html,返回給前端解析顯示。 後端python操作程式碼 #操作資料庫進行分頁 page = comm

JSP顯示資料

最近在做一個小程式,用到了JSP的分頁。雖然只是最簡單的分頁,但是還是花了我不少時間。這看似簡單的功能,實現起來還是稍微有點麻煩。實現分頁功能,需要知道資料的總個數,每頁應該有多少條資料,以及當前頁碼。假如總共有300條資料,每頁20條,那麼應該就有15頁;假設