Android ViewModel 和 Paging 3 库
Android ViewModel and Paging 3 Library
我正在构建一个聊天应用程序,其中每个数据都首先进入房间数据库,并且在数据插入时,recyclerview 会使用新数据进行更新。它按预期工作,但现在我需要将我的分页库更新到版本 3。为此,我需要更新这些更改
根据 this link and this
我已经进行了所有更改,但我仍然停留在 viewmodel
class。我没有得到我需要在此 class 中进行哪些更改以使其与 paging library version 3
一起使用
这是我的 ViewModel
public class Chat_ViewModel extends ViewModel {
public final LiveData<PagedList<ChatEntity_TableColums>> chatList;
public Chat_ViewModel() {
chatList = new LivePagedListBuilder<>(
RoomDatabase.getInstance(MyApplication.getmContext(),1).chatDAO().getPaginationChat(String.valueOf(UserID())),20).build();
}
}
在上面的 class 中,我知道 PagedList
和 LivePagedListBuilder
已被弃用,但在这里我不确定要在更新的库中替换什么以使其完美运行。
我的房间数据库查询
@Query("SELECT * FROM tapChatter WHERE userName = :UserName ORDER BY ID DESC")
PagingSource<Integer, ChatEntity_TableColums> getPaginationChat(String UserName);
面临的问题:
1:如何更新 ViewModel
以获得聊天应用程序的最佳性能?我目前的 ViewModel
是否适合聊天应用程序?
2: 是否可以在房间数据库数据更新时更新 RecyclerView
UI?
我成功地从 Paging 2 迁移到 Paging 3,并且在 ViewModel
和 Room Database
的帮助下,与 Paging 2 库相比,它确实非常流畅。很难为 java 用户找到很多 documentation/tutorial,所以最后我找到了这些链接以成功迁移。
Link 1
这些是我在 ViewHolder
和 Fragment
中为分页所做的更改
在 ViewModel 中创建实时数据
public final LiveData<PagingData<ChatEntity_TableColums>> chatList;
public Chat_ViewModel() {
Pager<Integer, ChatEntity_TableColums> pager = new Pager(
// Create new paging config
new PagingConfig(20, // Count of items in one page
20, // Number of items to prefetch
false, // Enable placeholders for data which is not yet loaded
20, // initialLoadSize - Count of items to be loaded initially
200),// maxSize - Count of total items to be shown in recyclerview
() -> RoomDatabase.getInstance(MyApplication.getmContext(),1).chatDAO().getPaginationChat(UserID));
);
CoroutineScope coroutineScope = ViewModelKt.getViewModelScope(this);
chatList = PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager),coroutineScope);
}
片段
viewModel = new ViewModelProvider(this).get(Chat_ViewModel.class);
viewModel.chatList.observe(getViewLifecycleOwner(), new Observer<PagingData<ChatEntity_TableColums>>() {
@Override
public void onChanged(PagingData<ChatEntity_TableColums> chatEntity_tableColumsPagingData) {
adapter.submitData(getLifecycle(),chatEntity_tableColumsPagingData);
}
});
我正在构建一个聊天应用程序,其中每个数据都首先进入房间数据库,并且在数据插入时,recyclerview 会使用新数据进行更新。它按预期工作,但现在我需要将我的分页库更新到版本 3。为此,我需要更新这些更改 根据 this link and this
我已经进行了所有更改,但我仍然停留在 viewmodel
class。我没有得到我需要在此 class 中进行哪些更改以使其与 paging library version 3
这是我的 ViewModel
public class Chat_ViewModel extends ViewModel {
public final LiveData<PagedList<ChatEntity_TableColums>> chatList;
public Chat_ViewModel() {
chatList = new LivePagedListBuilder<>(
RoomDatabase.getInstance(MyApplication.getmContext(),1).chatDAO().getPaginationChat(String.valueOf(UserID())),20).build();
}
}
在上面的 class 中,我知道 PagedList
和 LivePagedListBuilder
已被弃用,但在这里我不确定要在更新的库中替换什么以使其完美运行。
我的房间数据库查询
@Query("SELECT * FROM tapChatter WHERE userName = :UserName ORDER BY ID DESC")
PagingSource<Integer, ChatEntity_TableColums> getPaginationChat(String UserName);
面临的问题:
1:如何更新 ViewModel
以获得聊天应用程序的最佳性能?我目前的 ViewModel
是否适合聊天应用程序?
2: 是否可以在房间数据库数据更新时更新 RecyclerView
UI?
我成功地从 Paging 2 迁移到 Paging 3,并且在 ViewModel
和 Room Database
的帮助下,与 Paging 2 库相比,它确实非常流畅。很难为 java 用户找到很多 documentation/tutorial,所以最后我找到了这些链接以成功迁移。
Link 1
这些是我在 ViewHolder
和 Fragment
中为分页所做的更改
在 ViewModel 中创建实时数据
public final LiveData<PagingData<ChatEntity_TableColums>> chatList;
public Chat_ViewModel() {
Pager<Integer, ChatEntity_TableColums> pager = new Pager(
// Create new paging config
new PagingConfig(20, // Count of items in one page
20, // Number of items to prefetch
false, // Enable placeholders for data which is not yet loaded
20, // initialLoadSize - Count of items to be loaded initially
200),// maxSize - Count of total items to be shown in recyclerview
() -> RoomDatabase.getInstance(MyApplication.getmContext(),1).chatDAO().getPaginationChat(UserID));
);
CoroutineScope coroutineScope = ViewModelKt.getViewModelScope(this);
chatList = PagingLiveData.cachedIn(PagingLiveData.getLiveData(pager),coroutineScope);
}
片段
viewModel = new ViewModelProvider(this).get(Chat_ViewModel.class);
viewModel.chatList.observe(getViewLifecycleOwner(), new Observer<PagingData<ChatEntity_TableColums>>() {
@Override
public void onChanged(PagingData<ChatEntity_TableColums> chatEntity_tableColumsPagingData) {
adapter.submitData(getLifecycle(),chatEntity_tableColumsPagingData);
}
});