9

分页库很棒。但我发现缺少这个功能:

  • 加载数据时调度视图。假设我正在扩展PageKeyedDataSource:调用时位于顶部loadInitial的视图,调用时位于列表底部的视图loadAftercallback调用时视图应该消失。
  • 出现错误时调度视图。
  • 滑动刷新

由于现在这是不可能的,有没有人知道使用 PagingLibrary 的方法?至少有一种方法可以在同一个列表中使用不同的视图

4

2 回答 2

5

有一个很好的与 Paging 库相关的示例@yigit,它还展示了如何在 Recyclerview 中处理进度条、错误和重试。所以基本上他正在创建一个Listing.kt数据类,其中包含下面的NetworkStatePagedList

清单.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.ktSubRedditDataSourceFactory.kt

这是@yigit提供的 Google 示例链接。

于 2018-05-13T10:06:32.087 回答
0

主要思想是保留对数据源工厂创建的数据源的引用。下面是来自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>
于 2018-11-12T12:49:41.960 回答