标签: android-paging

分页3:如何在项目位置或具有特定id的项目加载列表

我有一个消息列表。每条消息都有一个唯一的 GUID。

我的设置适用于正常使用:用户单击对话,列表将打开,其中包含属于该对话的所有消息,按最新的顺序排列。

对话片段


    @Override
    public void onViewCreated(
        @NonNull View view,
        @Nullable Bundle savedInstanceState
    ) {
        LifecycleOwner lifecycleOwner = getViewLifecycleOwner();
        viewModel = new ViewModelProvider(this).get(ConversationViewModel.class);
        viewModel
            .getMessageList(lifecycleOwner, conversationId) // conversationId is a global variable
            .observe(lifecycleOwner, messagePagingData -> adapter.submitData(
                lifecycleOwner.getLifecycle(),
                messagePagingData 
            ));

        super.onViewCreated(view, savedInstanceState);

    }
Run Code Online (Sandbox Code Playgroud)

对话视图模型


    final PagingConfig pagingConfig = new PagingConfig(10, 10, false, 20);
    private final ConversationRepository conversationRepository;

    public ConversationViewModel(@NonNull Application application) {
        super(application);
        conversationRepository = new ConversationRepository(application);
    }

    public LiveData<PagingData<ItemMessage>> getMessageList(
        @NonNull LifecycleOwner lifecycleOwner,
        @NonNull String conversationId
    ) {
        return …
Run Code Online (Sandbox Code Playgroud)

android android-room android-paging android-paging-3

5
推荐指数
1
解决办法
3263
查看次数

`pagingAdapter.submitData()` 之后的代码未执行

我正在使用 Kotlin flow 和 Android Paging 3 库编写一个玩具 Android 应用程序。该应用程序调用一些远程 API 来获取照片列表,并RecyclerView使用PagingDataAdapter.

我发现后面的代码pagingAdapter.submitData()没有执行。

这是代码片段(该函数位于 a 中Fragment):

  fun refreshList() {
    lifecycleScope.launch {
      photosViewModel.listPhotos().collect {
        // `it` is PagingData<Photo>
        pagingAdapter.submitData(it)
        Log.e(TAG, "After submitData")
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

日志After submitData打印

但是,如果我将日志记录放在该行的前面pagingAdapter.submitData(),则会打印它,如下所示:

  fun refreshList() {
    lifecycleScope.launch {
      photosViewModel.listPhotos().collect {
        // `it` is PagingData<Photo>
        Log.e(TAG, "Before submitData")
        pagingAdapter.submitData(it)
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

打印日志Before submitData没有问题。

请问为什么会出现这种情况?

android kotlin android-paging android-paging-library kotlin-coroutines

5
推荐指数
1
解决办法
1933
查看次数

为什么 paging3 与 Mediator 会无限加载 APPEND

当我通过paging3将数据加载到recyclerview时,数据将被无限加载...... (这意味着我的APPEND将不断执行,并且会不断访问我的网络服务来加载数据)

这是关键代码

Dao is used to operate the StoriesBean

ConstantDao is to operate the latest 日期 that has been stored.

@Dao
interface ConstantDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(bean:ConstantKey)

    @Query("DELETE FROM constant_key")
    suspend fun clear()

    @Query("DELETE FROM constant_key WHERE key = :key")
    suspend fun delete(key: String)

    @Query("SELECT * FROM constant_key WHERE key = :key")
    fun get(key:String):ConstantKey

}
Run Code Online (Sandbox Code Playgroud)
@Dao
interface Dao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(passwords: List<StoriesBean>)

    @Query("DELETE FROM mydata")
    suspend fun clear()

    @Query("SELECT * FROM mydata") …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-paging

5
推荐指数
1
解决办法
1127
查看次数

分页3-数据库多次更新后列表滚动到开头

我将 Paging 3 与 RemoteMediator 和 Room 结合使用,通过 PagingDataAdapter 在 RecyclerView 中显示项目列表。我们遇到一个问题,当数据库中保存的基础数据多次更新时(在某些情况下),会导致列表跳转到开头。我已经成功创建了一个可重现的场景:

  • 我向下滚动到第二页
  • 我通过应用程序检查执行 SQL 更新语句,更改所显示项目之一的属性。这会触发 PagingSource 失效。项目 UI 已正确更新。滚动位置不会改变。已加载的页面(第一页和页面 > 2)似乎已从基于打印日志适配器的回收器视图中删除。仅当前可见页面保持加载状态。

然后我执行以下操作之一:

  • 我立即执行另一个 SQL 更新语句,更改任何显示项目的属性。我期望与第一次更新时的行为相同。然而,这次列表跳回第一页。
  • 或者,我们滚动回到列表顶部。分页库从数据库加载第一页。然后我们向下滚动回到第二页。我们执行相同的更新语句。这次滚动位置没有改变

看来潜在的问题是,在数据已经失效一次并且除当前页面之外的所有页面都已从回收器视图中删除后,分页库无法正确处理额外的数据库失效。

我的问题是:

  • 第二次更新后不保留滚动位置是否是预期行为?这是我这边的实现问题还是分页库中的错误?
  • 即使只有一项实际更改,除当前页面之外的所有页面都会从 RecyclerView 中删除,这是预期的行为吗?这可能是“DiffUtil.ItemCallback”问题吗?
  • 实施占位符可以解决问题吗?

存储库中的相关代码:

  @MainThread
  fun fetchNewData(...): LiveData<PagingData<DisplayCard>> {
    val pagingSourceFactory = ... // Get appropriate PagingSource based on some conditions

    @OptIn(ExperimentalPagingApi::class)
    return Pager(
      config = PagingConfig(
        pageSize = DiscussionUseCase.PAGE_SIZE, // PAGE_SIZE = 20
        prefetchDistance = 2,
        enablePlaceholders = false,
        initialLoadSize = DiscussionUseCase.PAGE_SIZE // PAGE_SIZE = …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-paging android-paging-library android-paging-3

5
推荐指数
1
解决办法
1898
查看次数

为什么paging 3.0一开始就加载2页

我正在尝试跟踪无限滚动。我已经在 pagingsource 中实现了跟踪。当我打开页面时,分页加载 2 页。甚至无需滚动,跟踪请求就会发送。如何停止分页加载 2 页?

ExamplePagingSource: PagingSource<String, UIItem>() {

private var scrollDepth = 0

override suspend fun load(params: LoadParams<String>): LoadResult<String, UIItem> {
    val pageKey = params.key ?: ""

    return try {
        val exampleData = getExampleData()

        
        scrollDepth++
        trackScroll()
        

        LoadResult.Page(
            data = items,
            prevKey = if (isFirstPage) null else pageKey,
            nextKey = exampleData.pageKey.ifEmpty { null }
        )
    } catch (e: Exception) {
        Timber.e(e, "Error")
        LoadResult.Error(e)
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 我用 prefetchDistance 解决了它

android kotlin android-paging

5
推荐指数
1
解决办法
2891
查看次数

如何更新LiveData值?

我正在为我的数据使用新的分页库.创建ViewModel并首次初始化实时数据时,一切正常.问题是,当我点击菜单项并希望用不同的数据集更新时,我无法更新我的实时数据的值.然后我的片段中的onChanged方法不会被调用.我已经阅读了有关MutableLiveData和setValue和postValue等可以更新实时数据的方法,但在我的情况下,我使用的是LivePagedListProvider并且无法从数据库返回MutableLiveData.

道:

@Query("SELECT * FROM teams ORDER BY name ASC")
LivePagedListProvider<Integer, Team> getAllTeams();
Run Code Online (Sandbox Code Playgroud)

分段:

mTeamViewModel.mTeamsList.observe(this, new Observer<PagedList<Team>>() {
        @Override
        public void onChanged(@Nullable PagedList<Team> teams) {
            mTeamAdapter.setList(teams);
        }
});
Run Code Online (Sandbox Code Playgroud)

视图模型:

public LiveData<PagedList<Team>> mTeamsList;

@Inject
DatabaseManager mDatabaseManager;

void setTeamViewModel(final DatabaseManager databaseManager) {
    mDatabaseManager = databaseManager;

    mTeamsList = mDatabaseManager.getAllTeams().create(
            0,
            new PagedList.Config.Builder()
                    .setPageSize(50)
                    .setPrefetchDistance(50)
                    .setEnablePlaceholders(true)
                    .build());

}

boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
        case R.id.action_favorite:
            mTeamsList = mDatabaseManager.getFavoriteTeams().create(
                    0,
                    new PagedList.Config.Builder()
                            .setPageSize(50)
                            .setPrefetchDistance(50)
                            .build());
            return true;
        default: return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-livedata android-architecture-components android-paging

4
推荐指数
1
解决办法
6171
查看次数

Android Google Paging库无效

我正在尝试在我的项目中实现谷歌的分页库.所有的东西都已编码,网络调用在loadInitial()中工作但它永远不会进入loadAfter().由于代码结构非常复杂,我不会直接在这里发布代码.

这是存储库:

https://github.com/raghavsatyadev/PagingDemo

文件链接:https://github.com/raghavsatyadev/PagingDemo/blob/master/app/src/main/java/com/rocky/invmx/modules/order/OrdersActivity.java

android android-architecture-components android-paging

4
推荐指数
2
解决办法
1587
查看次数

从Room观察LiveData会导致PagedListAdapter刷新,ViewModel也会在方向更改时刷新数据

我正在构建一个使用ArticleBoundaryCallback初始化对API的调用并将响应存储在Room中的应用。我还使用LiveData收听该表,并在PagedListAdapter中显示项目。

问题在于,每次将新数据插入到Room(Article)表中时,整个列表都会刷新。

同样,在配置更改时,似乎再次获取了整个数据(ViewModel不保留它,RecyclerView被重新创建)。

每次插入时,RecyclerView都会跳转(如果插入的是新数据,则跳转几行;如果将新数据替换为旧数据,则跳转到开头)。

整个代码在此GitHub存储库中

我的课程是:

文章:

@Entity(tableName = "article",
    indices={@Index(value="id")})public class Article {
@PrimaryKey(autoGenerate = false)
@SerializedName("_id")
@Expose
@NonNull
private String id;
@SerializedName("web_url")
@Expose
private String webUrl;
@SerializedName("snippet")
@Expose
private String snippet;
@SerializedName("print_page")
@Expose
private String printPage;
@SerializedName("source")
@Expose
private String source;
@SerializedName("multimedia")
@Expose
@Ignore
private List<Multimedium> multimedia = null;
Run Code Online (Sandbox Code Playgroud)

第DAO条:

@Dao
public interface ArticleDao {

@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(Article article);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void update(Article... repos);

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertArticles(List<Article> articles);


@Delete
void delete(Article... …
Run Code Online (Sandbox Code Playgroud)

android-livedata android-viewmodel android-paging mutablelivedata

4
推荐指数
1
解决办法
626
查看次数

如何使用 Paging 3 库更新单个项目

我试图找到一种方法来使用 Paging 3 库中的 PagingAdapter 更新回收器视图中的单个项目。我只找到了一种使用 PagingAdapter.refresh() 方法的方法。但是这种方法强制从网络加载所有列表。有人知道如何在不从网络加载所有页面的情况下实现它吗?

android android-jetpack android-paging android-paging-library

4
推荐指数
1
解决办法
1542
查看次数

有没有办法使用 PagingDataAdapter 查找项目并滚动到该视图?

我正在使用 Android Paging Library 3. 有没有办法使用 PagingDataAdapter 查找项目并滚动到该视图?因为我无法访问项目列表。或者我别无选择,只能使用普通的列表适配器?

android kotlin android-viewholder android-recyclerview android-paging

4
推荐指数
1
解决办法
369
查看次数