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

Android ListView 多來源數據分頁加載邏輯設計

     編輯:程式設計綜合問答

場景

MainActivity 顯示列表,支持「全部數據」與「篩選後數據」兩種模式,均需下拉加載更多(分頁)。

核心設計:狀態模式封裝數據源


// 1. 定義數據源接口
interface DataSource {
    void loadPage(int page, OnLoadListener listener);
    boolean hasMore();
}

// 2. 實現具體數據源
class AllDataSource implements DataSource { ... }
class FilterDataSource implements DataSource { ... }

// 3. ListView 持有當前數據源引用
private DataSource currentSource = new AllDataSource();

// 4. 篩選 Activity 返回時切換數據源
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQ_FILTER && resultCode == RESULT_OK) {
        FilterParams params = data.getParcelableExtra("params");
        currentSource = new FilterDataSource(params);
        adapter.clear(); // 清空舊數據
        currentSource.loadPage(1, listener); // 重新加載第一頁
    }
}

// 5. 統一分頁監聽邏輯
OnLoadListener listener = new OnLoadListener() {
    @Override
    public void onSuccess(List items, boolean hasMore) {
        adapter.addAll(items);
        currentSourceHasMore = hasMore;
    }
    @Override
    public void onError(Exception e) { ... }
};

// 6. 下拉加載更多觸發
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == SCROLL_STATE_IDLE && lastVisible == totalCount - 1) {
            if (currentSourceHasMore) {
                currentSource.loadPage(currentPage + 1, listener);
            }
        }
    }
    // ... onScroll 更新 lastVisible
});

關鍵點

  • 策略模式:將加載邏輯封裝到 `DataSource` 實現類,主界面只持有接口引用,消除 `if-else` 判斷。
  • 狀態重置:切換篩選條件時,必須 `adapter.clear()`、`currentPage=1`、`currentSourceHasMore=true`。
  • 空數據/錯誤態:`EmptyView` 展示友好提示,避免列表空白無反饋。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved