- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我目前正在考虑将分页架构库(在撰写本文时版本为 2.1.0-beta01
)整合到我的应用程序中。一个组件是允许用户从中删除单个项目的列表。此列表仅限网络,使用 Room 进行本地缓存没有意义。
PagedList
是不可变的,不支持修改。我已经读过,拥有一份列表副本,然后修改并作为新列表返回是要走的路。文档声明相同:
If you have more granular update signals, such as a network API signaling an update to a single item in the list, it's recommended to load data from the network into memory. Then present that data to the PagedList via a DataSource that wraps an in-memory snapshot. Each time the in-memory copy changes, invalidate the previous DataSource, and a new one wrapping the new state of the snapshot can be created.
我目前有基本的推荐实现来显示一个简单的列表。我的 DataSource
看起来像这样:
class MyDataSource<SomeItem> : PageKeyedDataSource<Int, SomeItem>() {
override fun loadInitial(params: LoadInitialParams<Int>, callback: LoadInitialCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
override fun loadAfter(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
override fun loadBefore(params: LoadParams<Int>, callback: LoadCallback<Int, SomeItem>) {
// Simple load from API and notification of `callback`.
}
}
文档中引用的内存缓存(没有 Room 并且没有使整个数据集失效)的具体实现是什么样的?
最佳答案
如果你想修改你的列表而不一直深入到数据层,你需要在你的适配器中覆盖 submitList
,然后在你的 PagedList
对象。每当 PagedList
更改时,您就可以将这些更改复制到本地数据集。不建议这样做,但这是一个非常简单的 hack 开始工作。
这是一个例子:
class MyListAdapter : PagedListAdapter<MyDataItem, MyViewHolder>(MyDiffCallback()) {
/**
* This data set is a bit of a hack -- we are copying everything the PagedList loads into our
* own list. That way we can modify it. The docs say you should go all the way down to the
* data source, modify it there, and then bubble back up, but I don't think that will actually
* work for us when the changes are coming from the UI itself.
*/
private val dataSet = arrayListOf<MyDataItem>()
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
//Forces the next page to load when we reach the bottom of the list
getItem(position)
dataSet.getOrNull(position)?.let {
holder.populateFrom(it)
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = parent.inflate(R.layout.my_view_holder)
return MyViewHolder(view)
}
class MyDiffCallback : DiffUtil.ItemCallback<MyDataItem>() {
override fun areItemsTheSame(oldItem: MyDataItem, newItem: MyDataItem) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: MyDataItem, newItem: MyDataItem) =
oldItem == newItem
}
override fun submitList(pagedList: PagedList<MyDataItem>?) {
pagedList?.addWeakCallback(listOf(), object : PagedList.Callback() {
override fun onChanged(position: Int, count: Int) {
dataSet.clear()
dataSet.addAll(pagedList)
}
override fun onInserted(position: Int, count: Int) {
dataSet.clear()
dataSet.addAll(pagedList)
}
override fun onRemoved(position: Int, count: Int) {
dataSet.clear()
dataSet.addAll(pagedList)
}
})
super.submitList(pagedList)
}
}
关于android - 修改 Android Paging Architecture 库中的 PagedList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53243704/
设置: 我们正在使用 PagedListEpoxyController , RxPagedListBuilder , ItemKeyedDataSource运行时 Mockgenerator它只是根据
我需要将域对象映射到 UI 对象并使用实时分页列表显示。 我试图映射 LiveData>至 LiveData>和 map PositionalDataSource至 PositionalDataSou
PagedList 已弃用,我应该改用什么?我正在使用分页库从 Firestore 中获取数据。 这是我的代码 val config = PagedList.Config.Builder()
我已经使用 Android 的分页库 (https://developer.android.com/topic/libraries/architecture/paging.html) 实现了一个带有分
我自己手动计算了一堆行,包括一些不在我的数据库中的附加数据。为了提高效率,我只根据页码和页面大小计算了当前页面中的行数。 我试图将其放入 PagedList 中,但这需要整个数据集,而不是我想显示的子
我的问题是如何更新 PagedList 中的项目? 在我的例子中,有 ListActivity 和 DetailsActivity。列表 Activity 使用分页组件从网络(仅)获取帖子,并使用分页
我一直在使用 Google 的 arch 库,但是使测试变得困难的一件事是使用 PagedList . 对于此示例,我使用存储库模式并从 API 或网络返回详细信息。 所以在 ViewModel 中我
我正在尝试将架构组件集成到我的应用程序中,即分页、LiveData、ViewModel。Room 之前已经集成和测试过,所以我可以返回 DataSource.Factory来 self 的 DAO 类
我在我的 View 中使用 PagedList,但我的脚手架 Controller 是使用这种默认索引操作生成的: public async Task Index() { return Vie
我正在使用 http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/sorting-filtering-and-pagin
我丢失了第二页和之后的所有数据。第一个结果/页面显示了正确的数据。第二页及之后,没有数据。 我的代码: public ActionResult Contact(int? pageNumber, str
我正在尝试显示产品列表并显示分页。所以,我决定使用 PagedList 插件。我在下面的链接中阅读了一些有关如何修改 Controller 和 View 的示例。 https://github.com
我安装了 PagedList.MVC Nugget 包,我正在尝试从列表中创建一个 PagedList ListProductsList 在我看来: @model PagedList.IPagedLi
已经两天了,我正在尝试学习如何将新的分页库与 Kotlin 语言一起使用(也是第一次) 所以我已经阅读了很多指南/教程和 Github repo (https://github.com/STAR-ZE
我正在使用 PagedList我的应用程序中的库。 使用 PagedListAdapter 一切正常.但是,我无法找到如何获得回调并收到 PagedList 已更新的通知。 在列表的ItemKeyed
嗨,我正在使用 mvvm 和分页库。分页效果完美。 我想从列表中删除项目。 当我尝试删除项目时 E/AndroidRuntime: FATAL EXCEPTION: main Process:
我正在使用 Play2.0 框架作为后端 API。所以我想从数据库中列出游乐设施,并且我想排除具有重复“地点”名称的游乐设施。 我正在使用此代码,但这给了我存储在数据库中的所有游乐设施记录。如何排除重
我正在使用 TroyGoode 制作的 PagedList:https://github.com/TroyGoode/PagedList/ 但我希望它呈现不同于我目前拥有的其他输出。 默认输出为:ww
我正在尝试找出在 asp.net MVC 中使用 ViewModel 实现分页列表的正确方法。 假设我有以下 PagedClientViewModel: public class PagedClien
我的通用存储库中有以下功能。 var list = query.ToPagedList(pageNumber, pageSizeNumber); 这行有两个问题 public IEnumerable
我是一名优秀的程序员,十分优秀!