как реализовать MVVM - PullRequest
       36

как реализовать MVVM

0 голосов
/ 09 февраля 2020

Я хочу использовать архитектуру MVVM, у меня есть пейджер с двумя фрагментами. каждый фрагмент имеет RecyclerView. Я создал класс модели представления, который расширяет AndroidViewModel, потому что мне нужно было передать контекст в мой репозиторий, который получает данные из класса API, который получает данные с сервера, используя залп. Я ожидал, что когда я поверну свой телефон, мой класс ViewModel не будет вызван, но на основании заданных мной журналов, кажется, что когда я поверну телефон, все снова запустится.

все в порядке? или у меня что-то не так?

это мои коды фрагментов:

val viewModel: Fragment1ViewModel =
        ViewModelProviders.of(this).get(Fragment1ViewModel(Application())::class.java)


    viewModel.getData().observe(this, Observer {
        Log.i("Log","data is Loaded in activity")
    })

это коды классов ViewModel:

class Fragment1ViewModel(application: Application) : AndroidViewModel(application) {
private val repository=Repository(application)

fun getData():LiveData<String>{
    Log.i("Log","get data in view model")
    return repository.getListItem()
}

}

это мои коды хранилища:

class Repository(private val context: Context) {
companion object {
    private lateinit var serverFetch: ServerFetch
}


private fun setContext() {
    serverFetch = ServerFetch(context)
}


fun getListItem():LiveData<String>{
    setContext()
    return serverFetch.getData()
}

}

и это мой класс ServerFetch, который работает как API для хранилища:

class ServerFetch(private val context: Context) {

private val api: String = "https://jsonplaceholder.typicode.com/posts"

private val result = MutableLiveData<String>()


private fun connect() {

    val request = StringRequest(Request.Method.GET, api, Response.Listener {
        Log.i("Log", "ServerFetch Successfully")
        result.value = it

    }, Response.ErrorListener {
        Log.i("Log", "ServerFetch field: ${it.toString()}")
    })

    val queue = Volley.newRequestQueue(context)
    queue.add(request)

}


fun  getData(): LiveData<String> {
    connect()
    return result
  }
}

, а вот мои журналы, когда приложение будет запущено в первый раз:

 I/Log: get data in view model
 I/Log: ServerFetch Successfully
 I/Log: data is Loaded in activity

и это мои журналы, когда я поворачиваю телефон

 I/Log: get data in view model
 I/Log: ServerFetch Successfully
 I/Log: data is Loaded in activity

1 Ответ

0 голосов
/ 10 февраля 2020

Вы должны получить его при создании модели представления.

ViewModel:

class Fragment1ViewModel(application: Application) : AndroidViewModel(application) {
    private val repository = Repository(application)
    val data = repository.getListItem()
}

Фрагмент:

viewModel.data.observe(this, Observer {
    Log.i("Log","data is Loaded in activity")
})
...