如何在 Kotlin 中使用 ViewModel
How to use ViewModel in Kotlin
我需要在屏幕旋转时保存从服务器下载的数据。我正在尝试使用 ViewModel 来执行此操作。但是我在这里得到 typeMismach model.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
}
})
}
class 笑话视图模型: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
参考 this
编辑#3
问题在于导入 Observer。此代码工作正常:
尝试
model.getJokes().observe(requireActivity(), android.arch.lifecycle.Observer{ it ->
fun onChanged(@Nullable jokesList: List<Jokes>) {
// do something
}
onChanged(it)
})
否则,您应该使用 List!
确保 List 不为空
我需要在屏幕旋转时保存从服务器下载的数据。我正在尝试使用 ViewModel 来执行此操作。但是我在这里得到 typeMismach model.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
}
})
}
class 笑话视图模型: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
参考 this
编辑#3 问题在于导入 Observer。此代码工作正常:
尝试
model.getJokes().observe(requireActivity(), android.arch.lifecycle.Observer{ it ->
fun onChanged(@Nullable jokesList: List<Jokes>) {
// do something
}
onChanged(it)
})
否则,您应该使用 List