【问题标题】:How to pass value from activity to ViewModel?如何将值从活动传递到 ViewModel?
【发布时间】:2021-06-22 12:39:21
【问题描述】:

如何将值从 Activity 传递到 View Model?我试图在网上找到任何东西,但我失败了。我想要的是:我在一项活动中有两个 recyclerviews。如果用户单击 recyclerview 1 中的项目 A,我想将此项目的 ID 发送到 View Model 并通过此 ID 返回一些东西。 testToShow 变量中的 dokladId 参数存在错误。

有什么简单的处理方法?

这是我的 ViewModel:

@HiltViewModel
class SkladViewModel @Inject constructor(
    repository: SybaseRepository
): ViewModel(){
    val skladyPolozky = repository.getAllSkladFromPolozka().asLiveData()
    val dokladyPolozky = repository.getAllHlavickyToDoklad().asLiveData()
    val testToShow = repository.getSelectedDokladyBySklad(dokladId).asLiveData()
}

这是活动

@AndroidEntryPoint
class DokladActivity : AppCompatActivity(), SkladAdapter.OnItemClickListener, DokladAdapter.OnItemClickListener {
    private val skladViewModel: SkladViewModel by viewModels()

    //private val dokladViewModel: DokladViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = ActivityDokladBinding.inflate(layoutInflater)
        //setContentView(R.layout.activity_doklad)
        setContentView(binding.root)
        binding.btVybratDoklad.setOnClickListener{
            openActivity(binding.root)
        }
        val skladAdapter = SkladAdapter (this)
        val dokladAdapter = DokladAdapter(this)
        binding.apply {
            recyclerViewSklady.apply {
                adapter = skladAdapter
                layoutManager = LinearLayoutManager(this@DokladActivity)
            }
            skladViewModel.skladyPolozky.observe(this@DokladActivity) {
                skladAdapter.submitList(it)
                Log.d("Doklad", skladAdapter.currentList.toString())
            }
            recyclerViewDoklady.apply {
                adapter = dokladAdapter
                layoutManager = LinearLayoutManager(this@DokladActivity)
            }
            skladViewModel.dokladyPolozky.observe(this@DokladActivity){
                dokladAdapter.submitList(it)
                Log.d("Doklad", dokladAdapter.currentList.toString())
            }
        }
    }

    fun openActivity(view: View){
        val intent = Intent(this,PolozkaActivity::class.java )
        startActivity(intent)
    }

    override fun onItemClick(polozkaSklad: SkladTuple) {
        val action = polozkaSklad.reg
    }

    override fun onItemClick(polozkaHlavicka: DokladTuple) {
        val intent = Intent(this, PolozkaActivity::class.java)
        intent.putExtra("doklad", polozkaHlavicka.doklad)
        //intent.putExtra("polozkaHlavicka", polozkaHlavicka as Serializable)
        startActivity(intent)
    }
}

具有某些功能的存储库:

fun getSelectedDokladyBySklad(sklad: Int) : Flow<List<SkladDokladTuple>>{
        return sybaseDao.getAllDokladFromPolozkaBySklad(sklad)
    }

和 DAO:

@Query("SELECT distinct doklad FROM cis06zebrap where sklad=:skladId")
    fun getAllDokladFromPolozkaBySklad(skladId:Int?=null): Flow<List<SkladDokladTuple>>

【问题讨论】:

  • 您在 Activity 中有 ViewModel 实例。这就是你所需要的。只需调用一个方法。

标签: android kotlin mvvm android-recyclerview


【解决方案1】:
@HiltViewModel
class SkladViewModel @Inject constructor(
    repository: SybaseRepository
): ViewModel(){
    val skladyPolozky = repository.getAllSkladFromPolozka().asLiveData()
    val dokladyPolozky = repository.getAllHlavickyToDoklad().asLiveData()
    val testToShow = repository.getSelectedDokladyBySklad(dokladId).asLiveData()


   fun someNameYouFindUseful(id: String) {
      // do something with the id
      ...
      // notify the UI
      someLiveDataYouShoudlBeObservingFromTheUI.value = SomeSealedClassWrappingTheStates.SomeStateYouFindDescriptive

   } 
}

然后在你的 Activity/Fragment 中你会做:

  viewModel.someNameYouFindUseful("the Id")

因为您可能在那里有一个 viewModel 引用。

要完成缺失的部分,请查看the Google official documentation about ViewModels,包括如何公开“状态”并对其做出反应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多