Попробуйте получить данные из backendless, используя ViewModel, но получите IllegalArgumentException: отсутствует общедоступный конструктор по умолчанию без аргументов - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь получить данные из Backendless, я использую kotlin и MVVM arch.Я очень новичок и в Kotlin, и в MVVM.Эти даты будут отображаться в программе recyclerView во фрагменте (который находится на вкладке).Я получаю эту ошибку:

 java.lang.IllegalArgumentException: Missing public, default no-argument constructor
    at com.backendless.Persistence.of(Persistence.java:833)
    at com.example.drake.kunuk.ui.buy.BuyViewModel.loadBuys(BuyViewModel.kt:26)
    at com.example.drake.kunuk.ui.buy.BuyViewModel.getBuys(BuyViewModel.kt:19)
    at com.example.drake.kunuk.ui.buy.BuyFragment.onActivityCreated(BuyFragment.kt:37)

......................................................................

class BuyViewModel : ViewModel() {
// TODO: Implement the ViewModel
private lateinit var buys: MutableLiveData<List<Buy>>

fun getBuys(): LiveData<List<Buy>> {
    if(!::buys.isInitialized) {
        buys = MutableLiveData()
        loadBuys()
    }
    return buys
}

private fun loadBuys(){
    lateinit var buy: List<Buy>
    Backendless.Persistence.of(Buy::class.java)
        .find(object : AsyncCallback<List<Buy>> {
            /*This will give the response from Backendless*/
            override fun handleResponse(response: List<Buy>) {
                for (i in response.indices) {
                    buy = listOf(response[i])
                }
                buys.value = buy

            }
            override fun handleFault(fault: BackendlessFault?) {
                TODO("not implemented")
            }

        })

}
}

Это код моего BuyAdapter:

class BuyAdapter(internal var context: Context,
             internal var ressource: Int,
             internal var buyList: ArrayList<Buy>
) : RecyclerView.Adapter<BuyAdapter.ViewHolder>() {

override fun getItemCount(): Int {
    return buyList.size
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
    val view = LayoutInflater.from(context)
        .inflate(ressource, parent, false)
    return ViewHolder(view)
}


override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val buy: Buy = buyList[position]

    holder.price.text = buy.price.toString()
}

class ViewHolder(v: View) : RecyclerView.ViewHolder(v){
    var price: TextView = v.tvPrice

}

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема возникает из-за отсутствия конструктора без аргументов в классе данных.Поэтому я изменил это:

data class Buy(val address: String,
           val price: Int,
           val propertyDesc: String,
           val numberOfRoom: Int,
           val numberOfBath: Int,
           val numberOfCar: Int,
           val propertyImage: String,
           val propertyLocation: String,
           val amenities: String)

на следующее:

data class Buy(var address: String = "",
           var price: Int = 0,
           var propertyDesc: String = "",
           var numberOfRoom: Int = 0,
           var numberOfBath: Int = 0,
           var numberOfCar: Int = 0,
           var propertyImage: String = "",
           var propertyLocation: String = "",
           var amenities: String = "")

Чтобы компилятор автоматически генерировал конструктор без аргументов, вы должны назначить значение по умолчанию для каждого параметра первичного конструктораи не забывайте использовать var.Или Вы можете объявить второй конструктор без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...