簡體   English   中英

我們可以在觀察者中使用觀察者嗎?

[英]Can we use an observer in an observer?

大家好,我面臨以下問題。 我有一個數據庫室,我有 2 個表 POST_TABLE 和 SELL_TABLE。

現在我需要從兩個表中獲取數據並添加到數組列表中。 我使用觀察者來跟蹤銷售商品何時被加載,然后將其添加到數組列表中,我對發布商品也是如此

我這樣做是為了在回收站視圖中顯示兩個不同的視圖類型對象。

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

在我看來,我在家庭片段的觀察者中制作觀察者是錯誤的。

是的,有更好的方法來處理這種情況。

其中之一是下面的一個:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM