[英]JSON data not showing in the Recylerview MVVM
我正在尝试使用数据绑定在 Recyclerview 中解析 Json 。 当我运行应用程序时,它只显示没有错误/崩溃的空白屏幕。
Json 数据:
{“味精”:[“足球”,“板球”,“棒球”,“橄榄球”,“海湾”],“状态”:“成功”}
Api
interface SportsApi {
/**
* Get the Sports from the API
*/
@GET("/sports")
fun getSports(): Observable<Sports>
}
适配器类:
class PostListAdapter: RecyclerView.Adapter<PostListAdapter.ViewHolder>() {
private lateinit var postList:Sports
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(postList)
}
override fun getItemCount(): Int {
return if(::postList.isInitialized) postList.msg.size else 0
}
fun updatePostList(postList: Sports){
this.postList = postList
notifyDataSetChanged()
}
class ViewHolder(private val binding: ItemPostBinding):RecyclerView.ViewHolder(binding.postTitle){
private val viewModel = PostViewModel()
fun bind(post: Sports){
viewModel.bind(post)
binding.viewModel = viewModel
}
}
}
和 PostViewModel class:
class PostViewModel:BaseViewModel() {
private val postTitle = MutableLiveData<String>()
fun bind(sports: Sports){
postTitle.value = sports.msg.toString()
}
fun getPostTitle():MutableLiveData<String>{
return postTitle
}
}
有人可以让我知道我在哪里做错了或如何解决吗? 如果您需要任何进一步的细节,请告诉我。
编辑:item_post.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewModel"
type="com.gk007.example.ui.post.PostViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/post_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textStyle="bold"
app:mutableText="@{viewModel.getPostTitle()}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</layout>
PostListViewModel class:
class PostListViewModel:BaseViewModel(){
@Inject
lateinit var postApi: PostApi
val postListAdapter: PostListAdapter = PostListAdapter()
val loadingVisibility: MutableLiveData<Int> = MutableLiveData()
val errorMessage:MutableLiveData<Int> = MutableLiveData()
val errorClickListener = View.OnClickListener { loadPosts() }
private lateinit var subscription: Disposable
init{
loadPosts()
}
override fun onCleared() {
super.onCleared()
subscription.dispose()
}
private fun loadPosts(){
subscription = postApi.getPosts()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { onRetrievePostListStart() }
.doOnTerminate { onRetrievePostListFinish() }
.subscribe(
{ result -> onRetrievePostListSuccess(result) },
{ onRetrievePostListError() }
)
}
private fun onRetrievePostListStart(){
loadingVisibility.value = View.VISIBLE
errorMessage.value = null
}
private fun onRetrievePostListFinish(){
loadingVisibility.value = View.GONE
}
private fun onRetrievePostListSuccess(postList: List<String>){
postListAdapter.updatePostList(postList)
}
private fun onRetrievePostListError(){
errorMessage.value = R.string.post_error
}
}
试试这个adapter
和holder
。 从持有人中移除ViewModel
。 与其通过完整的Sports
object,不如只通过 List。
class PostListAdapter: RecyclerView.Adapter<PostListAdapter.ViewHolder>() {
private lateinit var sports: List<String>
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(sports[position])
}
override fun getItemCount(): Int {
return if(::sports.isInitialized) sports.size else 0
}
fun updateSports(sports: List<String>){
this.sports = sports
notifyDataSetChanged()
}
class ViewHolder(private val binding: ItemPostBinding):RecyclerView.ViewHolder(binding.root){
fun bind(sport: String){
binding.postTitle.text = sport
}
}
}
然后只传递msg , List 到updateSports
并从 xml 中删除ViewModel
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<TextView
android:id="@+id/post_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</layout>
更新的视图模型:
class PostListViewModel:BaseViewModel(){
@Inject
lateinit var postApi: PostApi
val postListAdapter: PostListAdapter = PostListAdapter()
val loadingVisibility: MutableLiveData<Int> = MutableLiveData()
val errorMessage:MutableLiveData<Int> = MutableLiveData()
val errorClickListener = View.OnClickListener { loadPosts() }
private lateinit var subscription: Disposable
init{
loadPosts()
}
override fun onCleared() {
super.onCleared()
subscription.dispose()
}
private fun loadPosts(){
subscription = postApi.getPosts()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { onRetrievePostListStart() }
.doOnTerminate { onRetrievePostListFinish() }
.subscribe(
{ result -> onRetrievePostListSuccess(result.msg) },
{ onRetrievePostListError() }
)
}
private fun onRetrievePostListStart(){
loadingVisibility.value = View.VISIBLE
errorMessage.value = null
}
private fun onRetrievePostListFinish(){
loadingVisibility.value = View.GONE
}
private fun onRetrievePostListSuccess(postList: List<String>){
postListAdapter.updateSports(postList)
}
private fun onRetrievePostListError(){
errorMessage.value = R.string.post_error
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.