分页库很棒。但我发现缺少这个功能:
- 加载数据时调度视图。假设我正在扩展
PageKeyedDataSource
:调用时位于顶部loadInitial
的视图,调用时位于列表底部的视图loadAfter
。callback
调用时视图应该消失。 - 出现错误时调度视图。
- 滑动刷新
由于现在这是不可能的,有没有人知道使用 PagingLibrary 的方法?至少有一种方法可以在同一个列表中使用不同的视图。
分页库很棒。但我发现缺少这个功能:
PageKeyedDataSource
:调用时位于顶部loadInitial
的视图,调用时位于列表底部的视图loadAfter
。callback
调用时视图应该消失。由于现在这是不可能的,有没有人知道使用 PagingLibrary 的方法?至少有一种方法可以在同一个列表中使用不同的视图。
有一个很好的与 Paging 库相关的示例@yigit,它还展示了如何在 Recyclerview 中处理进度条、错误和重试。所以基本上他正在创建一个Listing.kt
数据类,其中包含下面的NetworkState
和PagedList
清单.kt
data class Listing<T>(
// the LiveData of paged lists for the UI to observe
val pagedList: LiveData<PagedList<T>>,
// represents the network request status to show to the user
val networkState: LiveData<NetworkState>,
// represents the refresh status to show to the user. Separate from networkState, this
// value is importantly only when refresh is requested.
val refreshState: LiveData<NetworkState>,
// refreshes the whole data and fetches it from scratch.
val refresh: () -> Unit,
// retries any failed requests.
val retry: () -> Unit)
网络状态.kt
enum class Status {
RUNNING,
SUCCESS,
FAILED
}
@Suppress("DataClassPrivateConstructor")
data class NetworkState private constructor(
val status: Status,
val msg: String? = null) {
companion object {
val LOADED = NetworkState(Status.SUCCESS)
val LOADING = NetworkState(Status.RUNNING)
fun error(msg: String?) = NetworkState(Status.FAILED, msg)
}
}
RedditPostRepository.kt
interface RedditPostRepository {
fun postsOfSubreddit(subReddit: String, pageSize: Int): Listing<RedditPost>
enum class Type {
IN_MEMORY_BY_ITEM,
IN_MEMORY_BY_PAGE,
DB
}
}
SubRedditViewModel.k
观察Listing<RedditPost>
从RedditPostRepository.kt
通知到 UI 的状态和数据,UI 相应地更新视图。要了解有关如何从DatasourceNetworkState
传播 到 ViewModel 的更多信息,请查看PageKeyedSubredditDataSource.kt和SubRedditDataSourceFactory.kt
这是@yigit提供的 Google 示例链接。
主要思想是保留对数据源工厂创建的数据源的引用。下面是来自https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample的代码片段
class SubRedditDataSourceFactory(
private val redditApi: RedditApi,
private val subredditName: String,
private val retryExecutor: Executor) : DataSource.Factory<String,
RedditPost>() {
val sourceLiveData = MutableLiveData<PageKeyedSubredditDataSource>()
override fun create(): DataSource<String, RedditPost> {
val source = PageKeyedSubredditDataSource(redditApi, subredditName,
retryExecutor)
sourceLiveData.postValue(source)
return source
}
}
在此代码示例中,“sourceLiveData”发布活动数据源。反过来,数据源可以将所有相关信息暴露给视图,例如网络状态和第一次加载是否完成的指示器
为了添加刷新行为,使用 SwipeRefreshLayout 包装回收器视图,如下所示。现在您可以访问数据源,您可以使其无效,并且视图将被刷新
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="LinearLayoutManager"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>