Я основал свой код на найденном примере, в котором используются компоненты архитектуры 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)
Но он вовремя отображает ошибку.