Android получает LiveData от дооснащения вызова - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь получить некоторые данные с помощью Retrofit в моем проекте Android, обновить это на ViewModel и мою деятельность с LiveData.

Вот мой класс обслуживания:

 class PaymentService {

        private var paymentMethodList = ArrayList<PaymentMethodModel>()
        private val paymentMethodListLiveData = MutableLiveData<List<PaymentMethodModel>>()

        init {
            paymentMethodListLiveData.value = paymentMethodList
        }

        fun fetchPaymentMethods() {
            val retrofit = Retrofit.Builder()
                .baseUrl(SERVICE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()

            val service = retrofit.create(PaymentClient::class.java)
            val jsonCall = service.getListOfPaymentMethods()
            jsonCall.enqueue(object : Callback<List<PaymentMethodModel>> {
                override fun onResponse(call: Call<List<PaymentMethodModel>>, response: Response<List<PaymentMethodModel>>) {
                    paymentMethodList = (response.body() as ArrayList<PaymentMethodModel>?)!!
                }

                override fun onFailure(call: Call<List<PaymentMethodModel>>, t: Throwable) {
                    //TODO
                }
            })
        }

Ивот где я пытаюсь прослушать изменения в списке:

goToNextButton.setOnClickListener {

            paymentMethods = PaymentMethodSelectionViewModel().getAllPaymentMethods()
            paymentMethods!!.observe(viewLifecycleOwner, Observer {
                Log.e("", "")
            })
        }

Проблема в том, что до сих пор я получаю список только в первый раз с 0 элементами, и этот метод наблюдателя невызов после того, как сделан остальной вызов и обновлен список.


Редактировать

class PaymentRepository {

    private val paymentService = PaymentService()

    fun getPaymentMethods(): LiveData<List<PaymentMethodModel>> {
        paymentService.fetchPaymentMethods()
        return paymentService.getPaymentMethods()
    }

}


class PaymentMethodSelectionViewModel: ViewModel() {

    private val paymentRepository = PaymentRepository()
    private val paymentMethods = paymentRepository.getPaymentMethods()

    fun getAllPaymentMethods(): LiveData<List<PaymentMethodModel>> {
        paymentRepository.getPaymentMethods()
        return paymentMethods
    }

}

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Измените ваш запрос на viewmodel

class PaymentMethodSelectionViewModel: ViewModel() {

    //Data
    var paymentMethodList =  MutableLiveData<List<PaymentMethodModel>>()

    fun getAllPayments(){

        val retrofit = Retrofit.Builder()
            .baseUrl(SERVICE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val service = retrofit.create(PaymentClient::class.java)
        val jsonCall = service.getListOfPaymentMethods()

        jsonCall.enqueue(object : Callback<List<PaymentMethodModel>> {
            override fun onResponse(call: Call<List<PaymentMethodModel>>, response: Response<List<PaymentMethodModel>>) {

                var data: List<PaymentMethodModel>  = (response.body() as ArrayList<PaymentMethodModel>?)!!

               paymentMethodList.value=data


            }

            override fun onFailure(call: Call<List<PaymentMethodModel>>, t: Throwable) {
                //TODO
            }
        })
    }



}

в вашем представлении (деятельности) используйте

//load
paymentMethodSelectionViewModel.getAllPayments();


//Observers
 paymentMethodSelectionViewModel.paymentMethodList.observe(this,
   Observer { list ->
           // your code
       })

Я рекомендую вам использовать модификацию 2 с сопрограммами или RXJAVA2, посмотрите этот урок

https://medium.com/@amtechnovation/android-architecture-component-mvvm-part-1-a2e7cff07a76

https://medium.com/@saquib3705/consuming-rest-api-using-retrofit-library-with-the-help-of-mvvm-dagger-livedata-and-rxjava2-in-67aebefe031d

2 голосов
/ 04 апреля 2019

Как говорит @tyczj в комментарии, каждый раз, когда вы используете LiveData, вы должны решить, когда все наблюдатели получат уведомление об обновлении.

Вы можете сделать это уведомление, вызвав функцию post вашего объекта paymentMethodListLiveData. Это правильный способ использовать LiveData в Java .

В Kotlin Я думаю, вы должны добавить что-то подобное в свой метод onResponse:

paymentMethodListLiveData.value = paymentMethodList;

чтобы неявно вызвать метод post и вызвать методы в вашей функции наблюдения.

Надеюсь, что это поможет или дать вам несколько советов.

Приветствия

...