Ничего не показывалось из ViewModel - PullRequest
1 голос
/ 01 октября 2019

Я новичок в Kotlin и пытаюсь использовать ViewModel с модификацией для ответа на вызовы, проблема в том, что модификация не вызывает ничего, поэтому ничего не появилось.

Попробовал возиться с ViewModels, где он называется

Попытался сгенерировать новый POJO из GSON

Поместить 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")
        }
    })
}

}

Ожидаемый ответ от дооснащения, но ни один не был найден, ноль также не было, значит, он даже не был выполнен.

РЕДАКТИРОВАТЬ:

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);

1 Ответ

1 голос
/ 01 октября 2019

resultsItem должно быть неизменным свойством, которое наблюдается в Деятельности / Фрагменте, а затем вам нужно просто позвонить 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)
...