如何在Kotlin中使用ViewModel



我需要在屏幕旋转时保存从服务器下载的数据。我试图使用ViewModel来做到这一点。这里我得到typeemismachmodel.getJokes().observe(this, object : Observer<List<Jokes>>()

class ItemsFragment : Fragment() {
var type: String? = ""
private var api: Api? = null
var adapter = ItemsAdapter()
private var jokes: List<Jokes> = ArrayList()
private var jokesCount: Int? = null
private var items: Result? = null
private var itemsCount: ResultCount? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val args = arguments
type = args?.getString(KEY_TYPE)
api = (activity?.application as App).api
val model = ViewModelProviders.of(this).get(JokesViewModel::class.java)
model.getJokes().observe(this, object : Observer<List<Jokes>>() {
fun onChanged(@Nullable jokesList: List<Jokes>) {
adapter = ItemsAdapter()
recycler.adapter = adapter
}
})
}

类JokesViewModel: ViewModel() {

private var api: Api? = null
var adapter = ItemsAdapter()
private var jokes: List<Jokes> = ArrayList()
private var items: Result? = null
private var jokeList: MutableLiveData<List<Jokes>>? = null
fun getJokes(): LiveData<List<Jokes>> {
if (jokeList == null) {
jokeList = MutableLiveData()
loadItems(5)
}
return jokeList as MutableLiveData<List<Jokes>>
}

private fun loadItems(jokeCount: Int?) {
val call = api?.getItems(jokeCount)
call?.enqueue(object : Callback<Result> {
override fun onResponse(call: Call<Result>, response: Response<Result>) {
items = response.body()
jokes = items!!.value
items?.let { adapter.setJokes(jokes) }
adapter.notifyDataSetChanged()
}
override fun onFailure(call: Call<Result>, t: Throwable) {
println(t)
}
})
}

}

在片段this不是一个生命周期所有者尝试使用requireActivity()viewLifecycleOwner参考这个

编辑# 3问题是在导入观察者。下面的代码运行良好:

model.getJokes().observe(requireActivity(), android.arch.lifecycle.Observer{ it -> 
fun onChanged(@Nullable jokesList: List<Jokes>) {
// do something
}
onChanged(it)
})

否则,您应该使用List!确保List不为空。

最新更新