ViewModel 没有显示任何内容
Nothing showed up from ViewModel
我是 Kotlin 的新手,正在尝试使用 ViewModel 进行改造来调用响应,问题是改造不会调用任何东西,所以什么也没有出现。
尝试在调用它的地方弄乱 ViewModels
尝试从 GSON 生成新的 POJO
将 uses-permission INTERNET 放入 AndroidManifest
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")
}
})
}
}
改造的预期响应,但 none 被发现,null 也不存在意味着它甚至没有执行。
编辑:
class MovieFragment : Fragment() {
companion object {
fun newInstance() = MovieFragment()
}
private lateinit var viewModel: MovieView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
recycler.setHasFixedSize(true)
recycler.layoutManager = LinearLayoutManager(context)
recycler.adapter = MovieAdapter(viewModel.getData(), this.context!!)
viewModel = ViewModelProviders.of(this).get(MovieView::class.java)
return inflater.inflate(R.layout.movie_fragment, container, false)
}
}
和
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MovieFragment movieFragment = new MovieFragment();
getSupportFragmentManager().beginTransaction().add(R.id.framelayout, movieFragment);
resultsItem
必须是一个不可变的 属性,它被 Activity/Fragment 观察到,然后您只需要调用 loadData()
。 fun getData()
这里甚至不需要。
至于调用没有执行..你确定什么都没有执行吗?不是 onResponse
也不是 onFailure
?这对我来说似乎不可能。也许将 t.printStackTrace()
放在 onFailure
中,然后在 LogCat 中查看是否有此堆栈跟踪。
编辑:
将 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)
我是 Kotlin 的新手,正在尝试使用 ViewModel 进行改造来调用响应,问题是改造不会调用任何东西,所以什么也没有出现。
尝试在调用它的地方弄乱 ViewModels
尝试从 GSON 生成新的 POJO
将 uses-permission INTERNET 放入 AndroidManifest
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")
}
})
}
}
改造的预期响应,但 none 被发现,null 也不存在意味着它甚至没有执行。
编辑:
class MovieFragment : Fragment() {
companion object {
fun newInstance() = MovieFragment()
}
private lateinit var viewModel: MovieView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
recycler.setHasFixedSize(true)
recycler.layoutManager = LinearLayoutManager(context)
recycler.adapter = MovieAdapter(viewModel.getData(), this.context!!)
viewModel = ViewModelProviders.of(this).get(MovieView::class.java)
return inflater.inflate(R.layout.movie_fragment, container, false)
}
}
和
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MovieFragment movieFragment = new MovieFragment();
getSupportFragmentManager().beginTransaction().add(R.id.framelayout, movieFragment);
resultsItem
必须是一个不可变的 属性,它被 Activity/Fragment 观察到,然后您只需要调用 loadData()
。 fun getData()
这里甚至不需要。
至于调用没有执行..你确定什么都没有执行吗?不是 onResponse
也不是 onFailure
?这对我来说似乎不可能。也许将 t.printStackTrace()
放在 onFailure
中,然后在 LogCat 中查看是否有此堆栈跟踪。
编辑:
将 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)