如何从片段RecyclerView更新活动视图

时间:2019-12-20 15:53:07

标签: android-activity android-recyclerview

我有MainActivity,它具有AppBar(带有“购物车” TextView)和FrameLayout(带有包含RecyclerView的Fragment)。此RecyclerView有一个用于增加购物车价值计数的按钮。我希望该计数更新MainActivity中的购物车值。

我找到了这个,但没有完整的解释“ Updating views of Activity or Fragment from a RecyclerView adapter”。

1 个答案:

答案 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++
    }
}
  

什么是LiveDataSee 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中增加价值。