Android ViewModel中没有显示任何内容
我是Kotlin的新手,尝试使用带有改装的ViewModel调用响应,问题是改装不会调用任何东西,所以没有显示任何内容 尝试过在取名为ViewModels的地方乱搞 尝试从GSON生成新的POJO 将使用权限INTERNET放入AndroidManifest中Android ViewModel中没有显示任何内容,android,android-viewmodel,Android,Android Viewmodel,我是Kotlin的新手,尝试使用带有改装的ViewModel调用响应,问题是改装不会调用任何东西,所以没有显示任何内容 尝试过在取名为ViewModels的地方乱搞 尝试从GSON生成新的POJO 将使用权限INTERNET放入AndroidManifest中 class MovieView(context: Context) : ViewModel() { private val API_KEY: String = context.getString(R.string.api) privat
class MovieView(context: Context) : ViewModel() {
private val API_KEY: String = context.getString(R.string.api)
private val TAG = MovieView::class.java!!.getSimpleName()
private var resultsItem: MutableLiveData<List<ResultsItem>>? = null
fun getData(): LiveData<List<ResultsItem>> {
if (resultsItem == null) {
resultsItem = MutableLiveData()
loadData()
}
return resultsItem as MutableLiveData<List<ResultsItem>>
}
fun loadData() {
val apiInterface = ApiClient.getList().create(ApiInterface::class.java)
val responseCall = apiInterface.getMovieList(API_KEY)
responseCall.enqueue(object : Callback<Response> {
override fun onResponse(call: Call<Response>, response: retrofit2.Response<Response>) {
val resultsItemList = response.body()!!.results
resultsItem?.value = resultsItemList
Log.d(TAG,"response")
}
override fun onFailure(call: Call<Response>, t: Throwable) {
Log.d(TAG, "null")
}
})
}
}
及
resultsItem
必须是活动/片段观察到的不可变属性,然后只需调用loadData()
<这里甚至不需要code>fun getData()
至于没有执行的调用。。你确定什么都没有执行吗?不onResponse
也不onFailure
?在我看来,这是不可能的。可能将t.printStackTrace()
放入onFailure
中,并在日志中查看是否存在此stacktrace
编辑:
将commit
添加到MainActivity
中的片段事务中,如下所示:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.framelayout, movieFragment)
.commit();
您还应该观察片段内部的LiveData
:
val adapter = MovieAdapter(this.context!!)
recycler.adapter = adapter
viewModel = ViewModelProviders.of(this).get(MovieView::class.java)
viewModel.resultsItem.observe(this, Observer { adapter.update(it) })
viewModel.loadData()
并为ViewModel添加工厂:
private val factory = object: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MovieView(this@MovieFragment.context!!) as T
}
}
viewModel = ViewModelProviders.of(this, factory).get(MovieView::class.java)
private val factory=object:ViewModelProvider.factory{
重写趣味创建(modelClass:Class):T{
返回电影视图(this@MovieFragment.context!!)作为T
}
}
viewModel=ViewModelProviders.of(this,factory).get(MovieView::class.java)
请在调用getData()
@SandipSoni的地方发布活动/片段的代码。请参阅编辑的帖子,刚刚发布了两个类:)为什么要将LiveData
传递到MovieAdapter
?应该在片段内部直接观察到它,因为片段实现了LifecycleOwner
。您将如何做?目前还没有方法实现它@ErnestZamelcyknopet.printSStackTrace()
没有显示任何内容,尝试过之后什么也没有显示。可能是调用片段或初始化ViewModel时出错,原因是:java.lang.RuntimeException:无法创建com.example.movetv.movie.entity.adapter.movieViewClass的实例,因为您的ViewModel的构造函数中有上下文。如果要为viewModel创建自定义构造函数,则还需要将ViewModelProvider.Factory
对象传递到ViewModelProviders.of(此工厂)
调用中。现在无错误,它返回的回答是:)但是recyclerview出现了一些问题,因为它没有显示任何内容。请接受这个正确的答案,并分别询问有关recyclerview的问题。关于stackoverflow的问题不能太广泛,而这个问题已经相当广泛了。
val adapter = MovieAdapter(this.context!!)
recycler.adapter = adapter
viewModel = ViewModelProviders.of(this).get(MovieView::class.java)
viewModel.resultsItem.observe(this, Observer { adapter.update(it) })
viewModel.loadData()
private val factory = object: ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return MovieView(this@MovieFragment.context!!) as T
}
}
viewModel = ViewModelProviders.of(this, factory).get(MovieView::class.java)