我有一个RecyclerView,它显示从会议室数据库返回的LiveData<List<Item>>
。一切正常,但是,每次打开应用程序时,都需要对Item顺序进行随机化,以获得更加动态的感觉。
该项目显示在AllItemFragment
中。单击一个项目时,它将被添加到用户收藏夹中。然后,这会将项目添加到FavouriteFragment
。
每次更改数据时(即当单击一个项目时)都会调用SQL query
对RANDOM()
进行排序,因此将不起作用。
List.shuffle
对象上调用 LiveData
。
以以下格式检索数据:
DAO -> Repository -> SharedViewholder -> Fragment -> Adapter
DAO
@Query("SELECT * from items_table")
fun getAllItems(): LiveData<MutableList<Item>>
仓库
val mItemList: LiveData<MutableList<Item>> = itemDoa.getAllItems()
SharedViewHolder
init {
repository = ItemRepository(itemDao)
itemList = repository.mItemList
}
fun getItems(): LiveData<MutableList<Item>> {
return itemList
}
片段
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mSharedViewModel = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
mSharedViewModel.getItems().observe(viewLifecycleOwner, Observer { item ->
// Update the UI
item.let { mAdapter.setItems(it!!) }
})
}
适配器
internal fun setItems(items: MutableList<Item>) {
val diffCallback = ItemDiffCallback(this.mItems, items)
val diffResult = DiffUtil.calculateDiff(diffCallback)
this.mItems.clear()
this.mItems.addAll(items)
diffResult.dispatchUpdatesTo(this)
}
编辑
当用户按下“收藏夹”按钮时,使用switchMap()
仍会打乱整个列表
fun getItems(): LiveData<MutableList<Item>> {
return Transformations.switchMap(mItemList) { list ->
val newLiveData = MutableLiveData<MutableList<Item>>()
val newList = list.toMutableList()
Collections.shuffle(newList)
newLiveData.setValue(newList)
return@switchMap newLiveData }
}
答案 0 :(得分:1)
您应该考虑在LiveData
上使用switchMap
转换运算符。
return liveData.switchMap(list -> {
var newLiveData = LiveData<MutableList<Item>>()
var newList = list.toMutableList()
Collections.shuffle(newList)
newLiveData.setValue(newList)
return newLiveData
})
要创建新的LiveData,可以使用LiveData
构造函数和setValue(T value)
方法。
您可以设置Collections.shuffle(list)
您可以在存储库或视图模型中使用它。
答案 1 :(得分:1)
只需将.shuffled()
与种子Random
实例一起使用。想法是将列表随机化,但是以相同的方式随机化,直到过程终止并且用户重新启动应用程序以生成新种子。
存储库
private val seed = System.currentTimeMillis()
val mItemList: LiveData<MutableList<Item>> = Transformations.map(itemDoa.getAllItems()) {
it.shuffled(Random(seed))
}
种子在整个应用程序过程中必须保持一致。我认为将种子保存在存储库中是非常安全的,假设您的存储库以单例模式实现。如果不是这种情况,只需找到一个单例对象并缓存种子即可。