GridView翻頁(精確監聽AbsListView滾動至底部)

本文來自http://blog.csdn.net/hellogv/ ,引用必須註明出處!
       用戶使用android客戶端時,當ListView滾動至底部,能夠由一個按鈕來提示用戶是否讀下一頁,那麼若是使用GridView呢?如今不少WEB 2.0上的體驗就是當底部時自動讀取下一頁數據,GridView(ListView也可)能夠採用這種方法。網上已經有不少文章介紹瞭如何判斷ListView是否滾動至底部,原理是 AbsListView.getLastVisiblePosition() = (AbsListView.getCount() - 1) 即到底,若是往上拖一點,用戶看起來已經離開底部,但實際上 AbsListView.getLastVisiblePosition() == (AbsListView.getCount() - 1) 依然成立,會致使誤判斷。本文在它們基礎上加以改進,作到更精確地監聽是否滾動至底部。先來看看本文程序運行的效果:


原理是在AbsListView.getLastVisiblePosition() = =(AbsListView.getCount() - 1) 時,保存最後一個Item的絕對座標,若是兩次獲取的絕對Y值都同樣,即到底而後執行回調函數......源碼以下:
import android.view.View;
import android.widget.AbsListView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;

/**
* 滾動至列表底部,讀取下一頁數據
*/

public class AutoLoadListener implements OnScrollListener {

   public interface AutoLoadCallBack {
     void execute();
  }

   private int getLastVisiblePosition = 0, lastVisiblePositionY = 0;
   private AutoLoadCallBack mCallback;

   public AutoLoadListener(AutoLoadCallBack callback) {
     this.mCallback = callback;
  }

   public void onScrollStateChanged(AbsListView view, int scrollState) {

     if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
       //滾動到底部    
       if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
        View v = (View) view.getChildAt(view.getChildCount() - 1);
         int[] location = new int[2];
        v.getLocationOnScreen(location); //獲取在整個屏幕內的絕對座標    
         int y = location[1];

        MyLog.d( "x" + location[0], "y" + location[1]);
         if (view.getLastVisiblePosition() != getLastVisiblePosition && lastVisiblePositionY != y) //第一次拖至底部    
        {
          Toast.makeText(view.getContext(), "已經拖動至底部,再次拖動便可翻頁", 500).show();
          getLastVisiblePosition = view.getLastVisiblePosition();
          lastVisiblePositionY = y;
           return;
        } else if (view.getLastVisiblePosition() == getLastVisiblePosition && lastVisiblePositionY == y) //第二次拖至底部    
        {
          mCallback.execute();
        }
      }

       //未滾動到底部,第二次拖至底部都初始化    
      getLastVisiblePosition = 0;
      lastVisiblePositionY = 0;
    }
  }

   public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {

  }
}

主程序爲testScroll.java,源碼以下:

public class testScroll extends Activity {    
         /** Called when the activity is first created. */    
        @Override    
         public void onCreate(Bundle savedInstanceState) {    
                 super.onCreate(savedInstanceState);    
                setContentView(R.layout.main);    
                setTitle( "精確監聽AbsListView滾動至底部----hellogv");    
                GridView gridview = (GridView) findViewById(R.id.gridview);    
    
                 // 生成動態數組,而且轉入數據    
                ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();    
                 for ( int i = 0; i < 30; i++) {    
                        HashMap<String, Object> map = new HashMap<String, Object>();    
                        map.put( "ItemImage", R.drawable.icon); // 添加圖像資源的ID    
                        map.put( "ItemText", "NO." + String.valueOf(i)); // 按序號作ItemText    
                        lstImageItem.add(map);    
                }    
                 // 生成適配器的ImageItem <====> 動態數組的元素,二者一一對應    
                SimpleAdapter saImageItems = new SimpleAdapter( this, // 沒什麼解釋    
                                lstImageItem, // 數據來源    
                                R.layout.night_item, // night_item的XML實現    
    
                                 // 動態數組與ImageItem對應的子項    
                                 new String[] { "ItemImage", "ItemText" },    
    
                                 // ImageItem的XML文件裏面的一個ImageView,兩個TextView ID    
                                 new int[] { R.id.ItemImage, R.id.ItemText });    
                    
                 //添加自動讀頁的事件    
                AutoLoadListener autoLoadListener = new AutoLoadListener(callBack);    
                gridview.setOnScrollListener(autoLoadListener);    
                 // 添加而且顯示    
                gridview.setAdapter(saImageItems);    
                 // 添加消息處理    
                gridview.setOnItemClickListener( new ItemClickListener());    
        }    
    
        AutoLoadCallBack callBack= new AutoLoadCallBack(){    
    
                 public void execute() {    
                        Toast.makeText(testScroll. this, "滾動至底部", 500).show();    
                }    
                    
        };    
         // 當AdapterView被單擊(觸摸屏或者鍵盤),則返回的Item單擊事件    
         class ItemClickListener implements OnItemClickListener {    
                 public void onItemClick(AdapterView<?> arg0, // The AdapterView where the    
                                                                                                         // click happened    
                                View arg1, // The view within the AdapterView that was clicked    
                                 int arg2, // The position of the view in the adapter    
                                 long arg3 // The row id of the item that was clicked    
                ) {    
                         // 在本例中arg2=arg3    
                        HashMap<String, Object> item = (HashMap<String, Object>) arg0    
                                        .getItemAtPosition(arg2);    
                         // 顯示所選Item的ItemText    
                        setTitle((String) item.get( "ItemText"));    
                }    
    
        }    
}    

 

 
相關文章
相關標籤/搜索