導入 PullToRefresh (如 `chrisbanes/PullToRefresh` 或 `Android-PullToRefresh`) 後,編譯報錯、類找不到、資源衝突、運行崩潰。
| 原因 | 癥狀 | 解決方案 |
|---|---|---|
| 模塊未正確導入 | 找不到類、資源 R 報錯 | File → New → Import Module 選中 library 根目錄,確認 `settings.gradle` 包含 `:pulltorefresh` |
| 依賴未聲明 | 主模組編譯找不到符號 | 主模組 `build.gradle`: `implementation project(':pulltorefresh')` |
| SDK 版本不匹配 | 編譯失敗、屬性缺失 | 庫模組 `compileSdkVersion`、`targetSdkVersion` 與主模組一致,或升級主模組 |
| 支持庫版本衝突 | 重複類、運行時 Crash | 庫模組 `build.gradle` 移除具體版本,用 `api "androidx.appcompat:appcompat:$rootProject.appcompatVersion"` 統一由根項目管理 |
| 資源名稱衝突 | 合併資源失敗 | 庫模組資源前綴化:`resourcePrefix "ptr_"` |
| 項目不在同一工作區 | Gradle 找不到路徑 | 庫模組物理路徑需在項目根目錄下,或用 `includeFlat` 指定絕對路徑 |
| Gradle 緩存殘留 | 莫名其妙錯誤 | `./gradlew clean` + `File → Invalidate Caches / Restart` |
PullToRefresh 庫多年未維護,**建議遷移至官方組件**:
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
swipeRefresh.setOnRefreshListener(() -> {
loadData();
swipeRefresh.setRefreshing(false);
});
// build.gradle
implementation 'com.scwang.smart:refresh-layout-kernel:2.0.5'
implementation 'com.scwang.smart:refresh-header-classics:2.0.5'
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RecyclerView ... />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
✅ 支持所有 View、雙向刷新、自定義 Header/Footer、嵌套滑動、雙指縮放、RTL、Kotlin 協程。
PullToRefresh 導入失敗 90% 是 模塊導入姿勢錯誤 或 依賴版本衝突。現代 Android 開發請優先選擇 SmartRefreshLayout(功能全)或 SwipeRefreshLayout(輕量官方),避免維護已停更的第三方庫。