Android_Listview中使用執行緒實現無限載入更多專案的功能

NO IMAGE

在現在的SINA微博或者象twitter、dzone等網站中,當載入一個很長的列表時,往往都是先載入部分內容,然後當使用者用拖拉條往下拖動時,再載入更多的內容。這裡在android 中,可以用listview搭配執行緒實現同樣的功能,舉例如下: 

首先設定footer部分,即在listview的下面設定footview,footview的模版如下:

  1. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” 
  2. android:orientation=”horizontal” 
  3. android:layout_width=”fill_parent” 
  4. android:gravity=”center_horizontal” 
  5. android:padding=”3dp” 
  6. android:layout_height=”fill_parent”> 
  7. <TextView 
  8. android:id=”@id/android:empty” 
  9. android:layout_width=”wrap_content” 
  10. android:layout_height=”fill_parent” 
  11. android:gravity=”center” 
  12. android:padding=”5dp” 
  13. android:text=”Loading more days…”/> 
  14. </LinearLayout>

複製程式碼

然後記得在加到adapter前,把footview加到listview中去

  1. View footerView = ((LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.listfooter, null, false); 
  2. this.getListView().addFooterView(footerView); 
  3. this.setListAdapter(adapter);

複製程式碼

然後,listview的onscroll方法如下:

Java程式碼:

  1. this.getListView().setOnScrollListener(new OnScrollListener(){        
  2. public void onScrollStateChanged(AbsListView view, int scrollState) {
  3. }          
  4. public void onScroll(AbsListView view, int firstVisibleItem,   
  5. int visibleItemCount, int totalItemCount) {                  
  6. int lastInScreen = firstVisibleItem visibleItemCount;                
  7. String last=Integer.toString(lastInScreen);   
  8. Log.d(“show”,last);   
  9. String total=Integer.toString(totalItemCount);   
  10. Log.d(“total”,total);              
  11. if((lastInScreen == totalItemCount) && !(loadingMore)){                    
  12. Thread thread =  new Thread(null, loadMoreListItems);   
  13. thread.start();   
  14. }   
  15. }   
  16. });         
  17. Thread thread =  new Thread(null, loadMoreListItems);   
  18. thread.start();  

複製程式碼

下面來分析下,其中,可以預先設定一個屏的listview能顯示多少條記錄,比如設定為5條,這裡itemsPerPage=15,然後:

  1. int lastInScreen = firstVisibleItem visibleItemCount;

複製程式碼

這裡,獲得每屏中最後一條資料的位置,比如一次先顯示5條,則lastInScreen=5了。

  1. if((lastInScreen == totalItemCount) && !(loadingMore)){ 
  2. Thread thread =  new Thread(null, loadMoreListItems); 
  3. thread.start(); 
  4. }

複製程式碼

這裡是判斷,如果是滾動了滾動條,並且使用者以及功能瀏覽完了一次螢幕所需要的數目(比如5個),則啟用執行緒序loadMoreListItems去處理,載入另外的新的5個了。

而如果沒滾動,則第一次顯示時,也要啟用執行緒序loadMoreListItems去處理。下面看loadMoreListItems:

Java程式碼:

  1. private Runnable loadMoreListItems = new Runnable() {              
  2. public void run() {   
  3. loadingMore = true;   
  4. myListItems = new ArrayList<String>();   
  5. //Simulate a delay, delete this on a production environment!
  6. try { Thread.sleep(1000);   
  7. } catch (InterruptedException e) {}   
  8. //Get 15 new listitems   
  9. for (int i = 0; i < itemsPerPage; i ) {          
  10. myListItems.add(“Date: ” (d.get(Calendar.MONTH) 1) “/” d.get(Calendar.DATE) “/” d.get(Calendar.YEAR) );                                          
  11. d.add(Calendar.DATE, 1);      
  12. }        
  13. runOnUiThread(returnRes);            
  14. }   
  15. ;     

複製程式碼

在這個執行緒裡,實際上就是用迴圈往listview中加日期,產生從當天時間起的若干個日期格式,然後呼叫runOnUiThread(returnRes);去更新UI主執行緒,注意 runOnUiThread是android提供的方法,可以幫助你線上程中執行UI更新操作。

Java程式碼:

  1. private Runnable returnRes = new Runnable() {   
  2. public void run() {   
  3. if(myListItems != null && myListItems.size() > 0){   
  4. for(int i=0;i<myListItems.size();i )   
  5. adapter.add(myListItems.get(i));   
  6. }   
  7. adapter.notifyDataSetChanged();   
  8. loadingMore = false;   
  9. }   
  10. };  

複製程式碼

在更新主執行緒中,十分簡單,只不過往adapter中去增加元素,並且notifyDataSetChanged通知listview起變化了,並設定loadingMore=false,因為已經載入完了一次了。