【发布时间】:2019-12-02 10:21:23
【问题描述】:
我正在尝试使用改造库显示来自 github 的存储库列表,然后使用 recyclerView 库显示它。我在添加 recyclerView 之前检查了数据是否成功获取。但是添加recyclerView后,我得到了NullPointerException。
下面是我的视图模型、片段、适配器和数据类的代码
ListViewModel.kt
package com.kunalrai.githubtrends
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class ListViewModel : ViewModel() {
lateinit var repoList: MutableLiveData<List<Repo>>
fun getRepos(): MutableLiveData<List<Repo>>{
repoList = MutableLiveData()
loadRepos()
return repoList
}
private fun loadRepos() {
Api.RETROFIT_SERVICE.getRepos().enqueue( object: Callback<List<Repo>> {
override fun onFailure(call: Call<List<Repo>>, t: Throwable) {
Log.i("Failure: ", t.message)
}
override fun onResponse(call: Call<List<Repo>>, response: Response<List<Repo>>) {
if(response.body() != null){
repoList.value = response.body()!!
Log.i("response.body :",""+response.body()!!)
}
}
})
}
}
ListFragment.kt
package com.kunalrai.githubtrends
import androidx.lifecycle.ViewModelProviders
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.kunalrai.githubtrends.databinding.ListFragmentBinding
class ListFragment : Fragment() {
companion object {
fun newInstance() = ListFragment()
}
private val viewModel: ListViewModel by lazy {
ViewModelProviders.of(this).get(ListViewModel::class.java)
}
private lateinit var binding: ListFragmentBinding
var recyclerView: RecyclerView? = null
lateinit var recyclerAdapter: RecyclerAdapter
var repoList: List<Repo>? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = ListFragmentBinding.inflate(inflater, container, false)
binding.lifecycleOwner
binding.viewmodel = viewModel
setHasOptionsMenu(true)
recyclerView = view?.findViewById(R.id.rv_repo_list)
recyclerView?.layoutManager = LinearLayoutManager(context)
recyclerView?.setHasFixedSize(true)
viewModel.getRepos().observe(this,
Observer<List<Repo>> { repoList ->
recyclerAdapter = RecyclerAdapter(context, repoList!!)
recyclerView!!.adapter = recyclerAdapter
})
return binding.root
}
}
ListAdapter.kt
package com.kunalrai.githubtrends
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
class ListAdapter(private val context: Context?, private val repoList: List<Repo>) : RecyclerView.Adapter<ListAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.repo_item,parent,false)
return MyViewHolder(view)
}
override fun getItemCount(): Int {
return repoList.size
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.author.text = repoList[position].author
holder.repo.text = repoList[position].name
Glide.with(context!!).load(repoList[position].avatar)
.apply(RequestOptions().centerCrop())
.into(holder.image)
}
class MyViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {
val author: TextView = itemView!!.findViewById(R.id.owner_name)
val image: ImageView = itemView!!.findViewById(R.id.owner_image)
val repo: TextView = itemView!!.findViewById(R.id.repo_name)
}
}
Repo.kt(数据类)
package com.kunalrai.githubtrends
import com.squareup.moshi.Json
data class Repo(
@Json(name = "author")
var author: String,
@Json(name = "name")
var name: String,
@Json(name = "description")
var desc: String,
@Json(name = "avatar")
var avatar: String,
@Json(name = "language")
var language: String,
@Json(name = "url")
var url: String,
@Json(name = "stars")
var stars: String,
@Json(name = "forks")
var forks: String
)
我的错误堆栈:- (更新)
2019-11-29 16:43:57.686 20703-20703/? E/Zygote: isWhitelistProcess - Process is Whitelisted
2019-11-29 16:43:57.688 20703-20703/? E/Zygote: accessInfo : 1
2019-11-29 16:44:03.865 20703-20703/com.kunalrai.githubtrends E/RecyclerView: No adapter attached; skipping layout
【问题讨论】:
-
这是 ListFragment 的第 47 行吗?
recyclerAdapter = RecyclerAdapter(context, repoList!!) -
而不是在
recyclerAdapter = RecyclerAdapter(context, repoList!!)中使用repoList!!你应该使用 repoList ?: emptyList() likerecyclerAdapter = RecyclerAdapter(context, repoList ?: emptyList()) -
听起来像添加异常堆栈跟踪以了解您从哪里获得 KotlinNPE 会很有帮助。
-
不再有 NPE。我已经编辑了堆栈跟踪。仍然无法显示数据。
标签: android android-fragments kotlin android-recyclerview android-jetpack