Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android實現精確監聽AbsListView滾動至底部示例

Android實現精確監聽AbsListView滾動至底部示例

編輯:Android開發實例

       用戶使用android客戶端時,當ListView滾動至底部,可以由一個按鈕來提示用戶是否讀下一頁,那麼如果使用GridView呢?現在很多WEB 2.0上的體驗就是當底部時自動讀取下一頁數據,GridView(ListView也可)可以采用這種方法。網上已經有很多文章介紹了如何判斷ListView是否滾動至底部,原理是 AbsListView.getLastVisiblePosition() = (AbsListView.getCount() - 1) 即到底,如果往上拖一點,用戶看起來已經離開底部,但實際上 AbsListView.getLastVisiblePosition() == (AbsListView.getCount() - 1) 依然成立,會導致誤判斷。本文在它們基礎上加以改進,做到更精確地監聽是否滾動至底部。先來看看本文程序運行的效果:

 

本文在 Android入門第八篇之GridView(九宮圖)基礎上加入滾到事件判斷,文件名為AutoLoadListener.java,原理是在AbsListView.getLastVisiblePosition() = =(AbsListView.getCount() - 1) 時,保存最後一個Item的絕對坐標,如果兩次獲取的絕對Y值都一樣,即到底然後執行回調函數......源碼如下:

  1. import android.util.Log; 
  2. import android.view.View; 
  3. import android.widget.AbsListView; 
  4. import android.widget.Toast; 
  5. import android.widget.AbsListView.OnScrollListener; 
  6. /** 
  7.  * 滾動至列表底部,讀取下一頁數據 
  8.  */ 
  9. public class AutoLoadListener implements OnScrollListener{ 
  10.  
  11.     public interface AutoLoadCallBack { 
  12.         void execute(String url); 
  13.     } 
  14.  
  15.     private int getLastVisiblePosition = 0,lastVisiblePositionY=0; 
  16.     private AutoLoadCallBack  mCallback; 
  17.     public AutoLoadListener(AutoLoadCallBack callback) 
  18.     { 
  19.         this.mCallback = callback; 
  20.     } 
  21.      
  22.     public void onScrollStateChanged(AbsListView view, int scrollState) { 
  23.  
  24.         if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) { 
  25.             //滾動到底部 
  26.             if (view.getLastVisiblePosition() == (view.getCount() - 1)) { 
  27.                 View v=(View) view.getChildAt(view.getChildCount()-1); 
  28.                 int[] location = new  int[2] ; 
  29.                 v.getLocationOnScreen(location);//獲取在整個屏幕內的絕對坐標 
  30.                 int y=location [1]; 
  31.  
  32.                 Log.e("x"+location[0],"y"+location[1]); 
  33.                 if (view.getLastVisiblePosition()!=getLastVisiblePosition 
  34.                         && lastVisiblePositionY!=y)//第一次拖至底部 
  35.                 { 
  36.                     Toast.makeText(view.getContext(), "再次拖至底部,即可翻頁",500).show(); 
  37.                     getLastVisiblePosition=view.getLastVisiblePosition(); 
  38.                     lastVisiblePositionY=y; 
  39.                     return; 
  40.                 } 
  41.                 else if (view.getLastVisiblePosition()==getLastVisiblePosition 
  42.                         && lastVisiblePositionY==y)//第二次拖至底部 
  43.                 { 
  44.                     mCallback.execute(">>>>>拖至底部"); 
  45.                 } 
  46.             } 
  47.              
  48.             //未滾動到底部,第二次拖至底部都初始化 
  49.             getLastVisiblePosition=0;    
  50.             lastVisiblePositionY=0; 
  51.         } 
  52.     } 
  53.  
  54.     public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) { 
  55.          
  56.     } 

主程序為testScroll.java,源碼如下:

  1. import java.util.ArrayList; 
  2. import java.util.HashMap; 
  3.  
  4. import com.testScroll.AutoLoadListener.AutoLoadCallBack; 
  5.  
  6.  
  7. import android.app.Activity; 
  8. import android.os.Bundle; 
  9. import android.view.View; 
  10. import android.widget.AdapterView; 
  11. import android.widget.AdapterView.OnItemClickListener; 
  12. import android.widget.GridView; 
  13. import android.widget.SimpleAdapter; 
  14. import android.widget.Toast; 
  15.  
  16. public class testScroll extends Activity { 
  17.     /** Called when the activity is first created. */ 
  18.     @Override 
  19.     public void onCreate(Bundle savedInstanceState) { 
  20.         super.onCreate(savedInstanceState); 
  21.         setContentView(R.layout.main); 
  22.         setTitle("精確監聽AbsListView滾動至底部----hellogv"); 
  23.         GridView gridview = (GridView) findViewById(R.id.gridview); 
  24.  
  25.         // 生成動態數組,並且轉入數據 
  26.         ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); 
  27.         for (int i = 0; i < 30; i++) { 
  28.             HashMap<String, Object> map = new HashMap<String, Object>(); 
  29.             map.put("ItemImage", R.drawable.icon);// 添加圖像資源的ID 
  30.             map.put("ItemText", "NO." + String.valueOf(i));// 按序號做ItemText 
  31.             lstImageItem.add(map); 
  32.         } 
  33.         // 生成適配器的ImageItem <====> 動態數組的元素,兩者一一對應 
  34.         SimpleAdapter saImageItems = new SimpleAdapter(this, // 沒什麼解釋 
  35.                 lstImageItem,// 數據來源 
  36.                 R.layout.night_item,// night_item的XML實現 
  37.  
  38.                 // 動態數組與ImageItem對應的子項 
  39.                 new String[] { "ItemImage", "ItemText" }, 
  40.  
  41.                 // ImageItem的XML文件裡面的一個ImageView,兩個TextView ID 
  42.                 new int[] { R.id.ItemImage, R.id.ItemText }); 
  43.           
  44.         //添加自動讀頁的事件 
  45.         AutoLoadListener autoLoadListener =new AutoLoadListener(callBack); 
  46.         gridview.setOnScrollListener(autoLoadListener); 
  47.         // 添加並且顯示 
  48.         gridview.setAdapter(saImageItems); 
  49.         // 添加消息處理 
  50.         gridview.setOnItemClickListener(new ItemClickListener()); 
  51.     } 
  52.  
  53.     AutoLoadCallBack callBack=new AutoLoadCallBack(){ 
  54.  
  55.         public void execute(String url) { 
  56.             Toast.makeText(testScroll.this, url, 500).show(); 
  57.         } 
  58.          
  59.     }; 
  60.     // 當AdapterView被單擊(觸摸屏或者鍵盤),則返回的Item單擊事件 
  61.     class ItemClickListener implements OnItemClickListener { 
  62.         public void onItemClick(AdapterView<?> arg0,// The AdapterView where the 
  63.                                                     // click happened 
  64.                 View arg1,// The view within the AdapterView that was clicked 
  65.                 int arg2,// The position of the view in the adapter 
  66.                 long arg3// The row id of the item that was clicked 
  67.         ) { 
  68.             // 在本例中arg2=arg3 
  69.             HashMap<String, Object> item = (HashMap<String, Object>) arg0 
  70.                     .getItemAtPosition(arg2); 
  71.             // 顯示所選Item的ItemText 
  72.             setTitle((String) item.get("ItemText")); 
  73.         } 
  74.  
  75.     } 

 

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