我们能在观察者中使用观察者吗



大家好,我面临以下问题。我有一个数据库室,我有两个表POST_TABLE和SELL_TABLE。

现在我需要从两个表中获取数据并添加到数组列表中。我使用观察者来跟踪销售项目何时加载,然后将其添加到数组列表中,与发布项目相同

我这样做是为了在回收器视图中显示两种不同的视图类型对象。

在ViewModel中,一切都很简单,我可以访问数据库,接收sell和postDAO并初始化存储库。

在我看来,把观察者放在观察者在家的片段里是不对的。

在最佳实践中,我没有找到合适的答案。也许有人知道如何正确地从房间获取数据

From HomeFragment
private fun initObserver() {
viewModel.sellList.observe(viewLifecycleOwner, {
viewModel.addSellItemsToArray()

viewModel.postList.observe(viewLifecycleOwner, {
viewModel.addPostItemToArray()

initRecyclerView(viewModel.homeArrayList)
})
})
}
From ViewModel
private val sellRepository: SellRepository
private val postRepository: PostRepository
var sellList: LiveData<List<Sell>>
var postList: LiveData<List<Post>>
private var _homeItem = MutableLiveData<ArrayList<HomeItem>>().apply {
value = arrayListOf()
}
val homeItem get() = _homeItem
val homeArrayList = arrayListOf<HomeItem>()

init {
val sellDao = MainDatabase.getDatabase(application).sellDao()
val postDao = MainDatabase.getDatabase(application).postDao()
sellRepository = SellRepository(sellDao)
postRepository = PostRepository(postDao)
sellList = sellRepository.getAllSellList()
postList = postRepository.getPostList()
}
fun addSellItemsToArray() {
for (sell in sellList.value!!) {
val homeItem = HomeItem()
homeItem.userName = sell.userName
homeItem.userImage = sell.userImage
homeItem.imagesArray = sell.imagesArray
homeItem.desc = sell.desc
homeItem.itemForSell = sell.itemForSell
homeItem.price = sell.price
homeItem.country = sell.country
homeItem.city = sell.city
homeItem.address = sell.address
homeArrayList.add(homeItem)
}
}
fun addPostItemToArray() {
for (post in postList.value!!) {
val homeItem = HomeItem()
homeItem.userName = post.postedUserName
homeItem.userImage = post.userUrl
homeItem.imagesArray = arrayListOf(post.postUrl)
homeItem.desc = post.commit
homeItem.likesCount = post.likesCount
homeArrayList.add(homeItem)
}
}

在我看来,我把观察者中的观察者变成home片段是错误的。

是的,有更好的方法来处理这种情况。

其中一个是下面的:

class YourViewModel() : ViewModel() {
private val tempHomeList = mutableListOf<HomeItem>()
private val _homeList = MutableLiveData<HomeItem>()
val homeList: LiveData<HomeItem> = _homeList
private lateinit var sellRepository: SellRepository
private lateinit var postRepository: PostRepository
init {
val sellDao = MainDatabase.getDatabase(application).sellDao()
val postDao = MainDatabase.getDatabase(application).postDao()
sellRepository = SellRepository(sellDao)
postRepository = PostRepository(postDao)
}
fun initList() {
addSellItemsToArray()
addPostItemToArray()
_homeList.value = tempHomeList
}
private fun addSellItemsToArray() {
val sellList = sellRepository.getAllSellList()
for (sell in sellList.value!!) {
val homeItem = HomeItem()
homeItem.userName = sell.userName
homeItem.userImage = sell.userImage
homeItem.imagesArray = sell.imagesArray
homeItem.desc = sell.desc
homeItem.itemForSell = sell.itemForSell
homeItem.price = sell.price
homeItem.country = sell.country
homeItem.city = sell.city
homeItem.address = sell.address
tempHomeList.add(homeItem)
}
}
private fun addPostItemToArray() {
val postList = postRepository.getPostList()
for (post in postList.value!!) {
val homeItem = HomeItem()
homeItem.userName = post.postedUserName
homeItem.userImage = post.userUrl
homeItem.imagesArray = arrayListOf(post.postUrl)
homeItem.desc = post.commit
homeItem.likesCount = post.likesCount
tempHomeList.add(homeItem)
}
}
}

然后在你的碎片中做一些类似的事情:

class YourFragment : Fragment {

private val recyclerAdapter = YourRecyclerAdapter()
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
//init your views, view model and your recycler view adapter
//...
recyclerView.adapter = recyclerAdapter
}

//...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.homeList.observe(viewLifecycleOwner, { list ->
recyclerViewAdapter.updateList(list)
})
//start observing other liveData or do anything else here
//....
viewModel.initList()
}
}

还有一个适配器的样本。。。

class YourRecyclerAdapter : RecyclerView.Adapter<HomeItemAdapter.ViewHolder> {
private val homeList = mutableListOf<HomeItem>()
fun updateList(list: List<HomeItem>) {
homeList.clear()
homeList.addAll(list)
notifyDataSetChanged()
}
//.... the rest of your adapter and viewholder
}

最新更新