【发布时间】:2019-02-01 13:59:26
【问题描述】:
我的代码基于我发现的一个使用 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)
但它会按时显示错误。
【问题讨论】:
-
ViewModel 不应该知道上下文或任何关于 Android 的信息。所以我猜想视图需要订阅一个事件或者当调用 onClickPost 方法时 ViewModel 发出的东西。但是我面临着类似的问题,所以我对正确的答案很感兴趣。
-
试试singleliveevent 模式
-
@MidasLefko,似乎是这样,但我遇到了 ViewModelFactory 不灵活和动态接受不止一种类型的 ViewModel 的问题。
-
@gamofe 这听起来像是一个新问题.. .
-
它死了。我确实创建了一个新的stackoverflow.com/questions/52033403/…
标签: android mvvm android-recyclerview android-databinding android-viewmodel