我有MainActivity,它具有AppBar(带有“购物车” TextView)和FrameLayout(带有包含RecyclerView的Fragment)。此RecyclerView有一个用于增加购物车价值计数的按钮。我希望该计数更新MainActivity中的购物车值。
我找到了这个,但没有完整的解释“ Updating views of Activity or Fragment from a RecyclerView adapter”。
答案 0 :(得分:0)
没有比这个ViewModel
首先在build.gradle
中添加此依赖项:implementation 'android.arch.lifecycle:extensions:1.1.1'
您的ViewModel
类将如下所示:
class MyViewModel: ViewModel() {
val mCartInfo: MutableLiveData<Int> = MutableLiveData()
private var cnt = 0
fun addToCartCounter() {
//TODO Apply your logic here
mCartInfo.value = cnt++
}
}
什么是
LiveData
? See here
之后,您必须初始化ViewModel
并观察更改的数据,所有这些事情都将在AppBar的Activity
中完成:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myViewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
//These will observe any changes happen in ViewModel's MutableLiveData(it'll directly jump inside Observer)
//Observer is main important thing
myViewModel.mCartInfo.observe(this, Observer {
//tvCartCounter is Toolbar's TextView
tvCartCounter.text = it.toString()
})
}
}
在ViewModel
中获得Fragment
,然后单击按钮以调用ViewModel的方法:
class BlankFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_blank, container, false)
//Get your Activity's ViewModel
val myViewModel = ViewModelProviders.of(requireActivity()).get(MyViewModel::class.java)
//Button click
rootView.btnAddToCart.setOnClickListener {
//It'll call ViewModel's method
myViewModel.addToCartCounter()
}
return rootView
}
}
只要
addToCartCounter
()调用您的按钮,它就会在触发您的观察者后立即在MutableLiveData
中增加价值。