ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – 从视图模型类获取活动的上下文

2019-05-27 08:10:44  阅读:268  来源: 互联网

标签:android mvvm android-recyclerview android-databinding android-viewmodel


我的代码基于我发现的使用Android架构组件和数据绑定的示例.这对我来说是一种新的方式,它的编码方式使得很难使用所点击的帖子的信息正确地打开新活动.

这是帖子的适配器

class PostListAdapter : RecyclerView.Adapter<PostListAdapter.ViewHolder>() {
    private lateinit var posts: List<Post>

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostListAdapter.ViewHolder {
        val binding: ItemPostBinding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.context),
            R.layout.item_post,
            parent, false
        )

        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: PostListAdapter.ViewHolder, position: Int) {
        holder.bind(posts[position])
    }

    override fun getItemCount(): Int {
        return if (::posts.isInitialized) posts.size else 0
    }

    fun updatePostList(posts: List<Post>) {
        this.posts = posts
        notifyDataSetChanged()
    }

    inner class ViewHolder(private val binding: ItemPostBinding) : RecyclerView.ViewHolder(binding.root) {
        private val viewModel = PostViewModel()

        fun bind(post: Post) {
            viewModel.bind(post)
            binding.viewModel = viewModel
        }
    }
}

bind方法来自视图模型类:

class PostViewModel : BaseViewModel() {
    private val image = MutableLiveData<String>()
    private val title = MutableLiveData<String>()
    private val body = MutableLiveData<String>()

    fun bind(post: Post) {
        image.value = post.image
        title.value = post.title
        body.value = post.body
    }

    fun getImage(): MutableLiveData<String> {
        return image
    }

    fun getTitle(): MutableLiveData<String> {
        return title
    }

    fun getBody(): MutableLiveData<String> {
        return body
    }

    fun onClickPost() {
        // Initialize new activity from here, perhaps?
    }
}

在布局XML中,设置onClick属性

android:onClick=”@{() -> viewModel.onClickPost()}”

指向这个onClickPost方法确实有效但我无法从那里初始化Intent.我尝试了许多方法来获取MainActivitiy的上下文,但没有成功,例如

val intent = Intent(MainActivity::getApplicationContext, PostDetailActivity::class.java)

但它会按时显示错误.

解决方法:

试试:android:onClick =“@ {(view) – > viewModel.onClickPost(view)}”

同时更改onClickPost以获取视图.然后,您可以使用视图上的view.getContext()方法来访问存储在该视图中的Context.

但是,由于ViewModel不应引用包含Activity上下文的视图或任何其他类,因此在ViewModel中放置用于启动Activity的逻辑是不合适的.你一定要考虑一个单独的地方.

就个人而言,对于我的代码,如果它是一个简单的startActivity而没有任何额外的包袱,我创建了一个包含静态方法的独立类.通过数据绑定,我将导入该类并在onClick中使用它来使用我上面提到的方法启动一个新的Activity.

一个例子:

public class ActivityHandler{        
    public static void showNextActivity(View view, ViewModel viewModel){
        Intent intent = new Intent(); //Create your intent and add extras if needed
        view.getContext().startActivity(intent);
    }
}

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="whatever.you.want.ActivityHandler" />
        <variable name="viewmodel" type="whatever.you.want.here.too.ViewModel" />
    </data>

    <Button
        //Regular layout properties
        android:onClick="@{(view) -> ActivityHandler.showNextActivity(view, viewmodel)}"
        />
</layout>

在这里查看Listener Bindings:https://developer.android.com/topic/libraries/data-binding/expressions#listener_bindings

但是,根据所需的数据量,您可能希望将startActivity代码放在最适合您应用程序设计的其他类中.

标签:android,mvvm,android-recyclerview,android-databinding,android-viewmodel
来源: https://codeday.me/bug/20190527/1161847.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有