自定義 ArrayAdapter 實現 AbsListView.OnScrollListener,並作為 GridView 的適配器設置。但 onScroll() 和 onScrollStateChanged() 從未被調用,而 getView() 正常。
適配器 ≠ 監聽器。setAdapter() 僅負責數據綁定與視圖創建,不會自動註冊滾動監聽。必須顯式調用 setOnScrollListener()。
// 僅設置適配器,監聽器未註冊
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;
}
// ...
}
記住口訣:「適配器管數據,監聽器管事件,兩者各司其職,顯式註冊不偷懶」。