首页 > 解决方案 > 如何从片段 recyclerView 更新活动视图

问题描述

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

我找到了这个但没有完整的解释“从 RecyclerView 适配器更新 Activity 或 Fragment 的视图”。

标签: android-activityandroid-recyclerview

解决方案


没有比这更好的解决方案ViewModel

首先添加这个依赖build.gradleimplementation '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看这里

之后,您必须初始化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()
        })
    }
}

进入ViewModelFragment和您的按钮单击调用 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触发您的观察者后不久添加价值。


推荐阅读