首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android GridView 滾動監聽失效?正確設置 OnScrollListener 的姿勢

     編輯:程式設計綜合問答

問題現象

自定義 ArrayAdapter 實現 AbsListView.OnScrollListener,並作為 GridView 的適配器設置。但 onScroll() 和 onScrollStateChanged() 從未被調用,而 getView() 正常。

根本原因

適配器 ≠ 監聽器。setAdapter() 僅負責數據綁定與視圖創建,不會自動註冊滾動監聽。必須顯式調用 setOnScrollListener()。

錯誤代碼 vs 正確代碼

❌ 錯誤做法

// 僅設置適配器,監聽器未註冊
mGridView.setAdapter(new GalleryItemAdapter(mItems));

✅ 正確做法


// 1. 創建適配器實例
GalleryItemAdapter adapter = new GalleryItemAdapter(mItems);
// 2. 設置適配器
mGridView.setAdapter(adapter);
// 3. 關鍵:顯式註冊滾動監聽器(適配器本身實現了接口)
mGridView.setOnScrollListener(adapter);

為什麼不建議讓適配器實現監聽接口?

  • 職責不清:適配器負責數據→視圖,監聽器負責滾動事件,混合導致代碼耦合。
  • 生命週期風險:適配器可能被替換,導致監聽器失效或內存洩漏。
  • 推薦做法:使用匿名內部類或單獨類實現 OnScrollListener,在 Fragment/Activity 中註冊。

優化版代碼結構

public class PhotoGalleryFragment extends Fragment {
    private GridView mGridView;
    private GalleryItemAdapter mAdapter; // 持有引用

    @Override
    public View onCreateView(...) {
        // ...
        mAdapter = new GalleryItemAdapter(mItems);
        mGridView.setAdapter(mAdapter);
        mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                if (scrollState == SCROLL_STATE_IDLE) {
                    loadVisibleImages();
                } else {
                    mPhotoLoader.clearQueue();
                }
            }

            @Override
            public void onScroll(AbsListView view, int first, int count, int total) {
                if (mIsFirstIn && count > 0) {
                    loadVisibleImages();
                    mIsFirstIn = false;
                }
            }
        });
        return view;
    }
    // ...
}

總結

記住口訣:「適配器管數據,監聽器管事件,兩者各司其職,顯式註冊不偷懶」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved