在App Open上从会议室数据库中随机播放LiveData <list <item >>

时间:2019-05-13 23:00:07

标签: android kotlin android-room android-livedata

我有一个RecyclerView,它显示从会议室数据库返回的LiveData<List<Item>>。一切正常,但是,每次打开应用程序时,都需要对Item顺序进行随机化,以获得更加动态的感觉。

该项目显示在AllItemFragment中。单击一个项目时,它将被添加到用户收藏夹中。然后,这会将项目添加到FavouriteFragment

每次更改数据时(即当单击一个项目时)都会调用SQL queryRANDOM()进行排序,因此将不起作用。

出于明显的原因,不能在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 }
}

2 个答案:

答案 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))
}

种子在整个应用程序过程中必须保持一致。我认为将种子保存在存储库中是非常安全的,假设您的存储库以单例模式实现。如果不是这种情况,只需找到一个单例对象并缓存种子即可。