【问题标题】:Can we use an observer in an observer?我们可以在观察者中使用观察者吗?
【发布时间】:2021-09-25 20:18:39
【问题描述】:

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

现在我需要从两个表中获取数据并添加到数组列表中。 我使用观察者来跟踪 sell items 何时加载,然后将其添加到数组列表中,我对 post items

执行相同操作

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

在 ViewModel 中一切都很简单,我可以访问数据库、接收销售并发布 DAO 并初始化存储库。

在我看来,我做错了在主片段中的观察者中制作观察者。

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

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

【问题讨论】:

    标签: android android-room viewmodel observers


    【解决方案1】:

    在我看来,我做错了在主片段中的观察者中制作观察者。

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

    以下是其中之一:

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

    然后在您的 Fragment 中执行以下操作:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2014-03-24
      • 2011-06-09
      • 2016-08-26
      相关资源
      最近更新 更多