天天看點

ListView中的setOnScrollListener監聽事件

private void init(Context context) {
        super.setOnScrollListener(new OnScrollListener() {
            /**
             *監聽着ListView的滑動狀态改變。官方的有三種狀态SCROLL_STATE_TOUCH_SCROLL、SCROLL_STATE_FLING、SCROLL_STATE_IDLE:
             * SCROLL_STATE_TOUCH_SCROLL:手指正拖着ListView滑動
             * SCROLL_STATE_FLING:ListView正自由滑動
             * SCROLL_STATE_IDLE:ListView滑動後靜止
             * */
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                for(OnScrollListener listener:scrollListeners){
                   listener.onScrollStateChanged(view,scrollState);
                }
            }

            /**
             * firstVisibleItem: 表示在螢幕中第一條顯示的資料在adapter中的位置
             * visibleItemCount:則表示螢幕中最後一條資料在adapter中的資料,
             * totalItemCount則是在adapter中的總條數
             * */
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                  for(OnScrollListener listener : scrollListeners){
                      listener.onScroll(view,firstVisibleItem,visibleItemCount,totalItemCount);
                  }
            }
        });
}
           

2. OnScrollListener中的onScrollStateChanged 和 onScroll() 方法監聽回收不到的解決方案

原因:

首先OnScrollListener是焦點滾動的監聽事件,需要有焦點才能響應。如果在 ScrollView 中内嵌了 ListView 之後,動态計算了 ListView 的高度,并予以設定高度,那麼這時使用者拖動界面,造成的滾動是 ScrollView 的滾動,而并非 ListView 的滾動,此時焦點是被 ScrollView 奪去的, ListView 自然就不響應 OnScrollListener的監聽咯,同樣的在模拟器上使用滑鼠滾輪滑動ListView 導緻的不響應 OnScrollListener也是如此。

假設和解決辦法:

ListView中的setOnScrollListener監聽事件

如果此時listView 位于 ScrollView 的最底端,而 ListView 的上方還有一些資料控件需要顯示,而 listView 又需要動态設定高度且需要完成分頁加載的功能,如圖所示,該怎麼辦呢?

不要緊張,辦法是有的,接着往下看吧:

1.剛開始我采用監聽 ScrollView 滑動到最底端則加載更多的方式,可是這又導緻一個問題,當 ScrollView 内嵌 ListView 時候, ListView 的 notifyDataSetChanged()方法因為需要擷取界面資源的原因,在ScrollView 中重新整理時會導緻主線程的卡頓,具體原因不清楚,估計是調用 notifyDataSetChanged() 方法時,焦點的奪取導緻了主線程卡頓,那麼這種情況又不行了。

2.接着我想試試能不能自定義 ScrollView 在内嵌 ListView 的時候自動把焦點給 ListView ,可這又牽扯到一個問題, ScrollView 的滑動也是需要焦點的。糾結了一段時間後,我認為此解決方式太過麻煩且不通用,一旦遇到别的情況又要重新自定義控件。So , PASS!

最後我使出殺手锏,采用 ListView + HeadView + footerView 的方式,也就是分成三塊,自定義 HeadView 的顯示 内容,自定義 footerView 的顯示内容,既簡單又通用,完全滿足了我的需求,但是這裡有一個需要注意的,這種轉台( ListView 有 HeadView 的情況下)下給 lsitView 設定 OnItemClickListener,那麼OnItemClickListener的一個方法:

  void  onItemClick(AdapterView<?> arg0, View arg1,  int  arg2, long  arg3){

此時的點選position應該是arg3,而不是arg2,因為ListView的 HeadView 會占用一個 item 。

繼續閱讀