android之ExpandableListView 的滑動到底部的精確監聽事件


1.給expandableListView 監聽滑動到最底部的事件。最傳統的方法不適合。

// 監聽listview滾到最底部
expandableListView.setOnScrollListener(new OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        switch (scrollState) {
            // 當不滾動時
            case OnScrollListener.SCROLL_STATE_IDLE:
                // 判斷滾動到底部
                if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
                   //TODO
              }
              break;
        }
    }
 
    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
           int visibleItemCount, int totalItemCount) {
    }
});

2.第二種方法,網上搜到的。雖然這個方法沒解決我的問題,卻給了我很大靈感。用了全局坐標來定位。

參考URL:http://www.oschina.net/question/234345_44392

import android.util.Log;  
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(String url);  
    }  
  
    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];  
  
                Log.e("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) {  
          
    }  
}  

3.我參考精確坐標,我用了相對坐標。

  • 先算出了除卻標題與狀態欄的屏幕高度,即ExpandableListView所占屏幕的高度;
    titleBarHeight = Util.dip2px(48);
    Rect frame = new Rect();
    getActivity().getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    statusBarHeight = frame.top;
    otherHeight = DeviceInfo.HEIGHT - titleBarHeight - statusBarHeight;
  • 然后ExpandableListView滑動到最底部時,ExpandableListView離最屏幕底部是一個定值,我用的pad分辨率為1024*600.這個宣傳即是490;
phoneExSearchList.setOnScrollListener(new OnScrollListener() {

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                Logger.d(tag, "onScrollStateChanged... ..." + scrollState);
                if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
                    Logger.d(tag, "getLastVisiblePosition... ..." + view.getLastVisiblePosition()
                            + "-" + (view.getCount() - 1));
                    if (view.getLastVisiblePosition() == (view.getCount() - 1)) {
                        Logger.d(tag, "DeviceInfo.HEIGHT - " + DeviceInfo.HEIGHT);
                        Logger.d(tag, "DeviceInfo.WIDTH - " + DeviceInfo.WIDTH);
                        if (Math.abs(otherHeight - v.getBottom()) < 5) {
                            if (Util.isGoOn("onscroll", 800)) {
                                mhandler.sendEmptyMessage(SearchTudouResultFragment.GET_SEARCH_PAGE_TURN);
                            }
                        }
                    }
                }

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                    int totalItemCount) {
            }
        });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM