我有一个消息列表。每条消息都有一个唯一的 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) 我正在使用 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
当我通过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) 我将 Paging 3 与 RemoteMediator 和 Room 结合使用,通过 PagingDataAdapter 在 RecyclerView 中显示项目列表。我们遇到一个问题,当数据库中保存的基础数据多次更新时(在某些情况下),会导致列表跳转到开头。我已经成功创建了一个可重现的场景:
然后我执行以下操作之一:
看来潜在的问题是,在数据已经失效一次并且除当前页面之外的所有页面都已从回收器视图中删除后,分页库无法正确处理额外的数据库失效。
我的问题是:
存储库中的相关代码:
@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
我正在尝试跟踪无限滚动。我已经在 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 解决了它
我正在为我的数据使用新的分页库.创建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
我正在尝试在我的项目中实现谷歌的分页库.所有的东西都已编码,网络调用在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
我正在构建一个使用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
我试图找到一种方法来使用 Paging 3 库中的 PagingAdapter 更新回收器视图中的单个项目。我只找到了一种使用 PagingAdapter.refresh() 方法的方法。但是这种方法强制从网络加载所有列表。有人知道如何在不从网络加载所有页面的情况下实现它吗?
android android-jetpack android-paging android-paging-library
我正在使用 Android Paging Library 3. 有没有办法使用 PagingDataAdapter 查找项目并滚动到该视图?因为我无法访问项目列表。或者我别无选择,只能使用普通的列表适配器?
android kotlin android-viewholder android-recyclerview android-paging