Как решить java.lang.IllegalArgumentException - PullRequest
0 голосов
/ 15 февраля 2019

Когда я пишу этот код в kotlin customadapter

Он всегда вылетает со следующей ошибкой :

java.lang.IllegalArgumentException: параметр, указанный как не-null is null: метод kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, параметр listCountry

Полный код:

CustomAdapter.kt

class CustomAdapter(var context: Context,val  listCountry: List<Model.Country>) : RecyclerView.Adapter<CustomAdapter.CustomHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, position: Int): CustomHolder {
        val view = LayoutInflater.from(context).inflate(R.layout.custom_recycler,parent,false)

        return  CustomHolder(view)
    }

    override fun getItemCount(): Int = listCountry.size

    override fun onBindViewHolder(holder: CustomHolder, position: Int) {

        val flag = listCountry[position]

        Glide.with(context).load(flag.image).into(holder.countryFlag)

        holder.numCode.text = flag.numcode

        holder.countryName.text = flag.name

    }

    class CustomHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val numCode : TextView =  itemView.findViewById(R.id.tvCountryCode)
        val countryName : TextView = itemView.findViewById(R.id.tvCountryName)
        val countryFlag : ImageView = itemView.findViewById(R.id.ivCountryFlag)
    }

}

MainActivity.kt

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val apiservice = RetrofitClient().getClient()!!.create(RetrofitApiInterface::class.java)

    val call : Call<Model> = apiservice.getData()

    call.enqueue(object : Callback<Model>{
        override fun onFailure(call: Call<Model>?, t: Throwable?) {
            Log.e("Failure",t.toString())
        }

        override fun onResponse(call: Call<Model>?, response: Response<Model>?) {
            Log.e("Response","This is Successfull Response")

            val listCountry = response!!.body().data.countryList

            recyclerList.layoutManager = LinearLayoutManager(this@MainActivity)
            recyclerList.adapter = CustomAdapter(this@MainActivity,listCountry)
                //Toast.makeText(this@MainActivity,"Successfull",Toast.LENGTH_SHORT).show()
        }
    })
}
}

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Это потому, что response и countryList могут иметь значение null: response !!. Body (). Data.countryList Вы должны проверить это.

response?.body().data.countryList?.let {
        recyclerList.layoutManager = LinearLayoutManager(this@MainActivity)
        recyclerList.adapter = CustomAdapter(this@MainActivity, it)
    }

использование !!для nullable это плохая практика

0 голосов
/ 15 февраля 2019

У вас есть этот конструктор для вашего адаптера, который принимает ненулевое значение List<Model.Country>:

class CustomAdapter(var context: Context, val listCountry: List<Model.Country>)

А затем вы берете данные из сетевого ответа и передаете их в качестве параметра конструктору:

val listCountry = response!!.body().data.countryList
...
recyclerList.adapter = CustomAdapter(this@MainActivity, listCountry)

Именно здесь вы получаете сбой, потому что каким-то образом listCountry в итоге содержит значение null.

Скорее всего, одна из этих двух вещей идет не так, как надо:

  • Если ваш класс модели здесь написан на Java, этот countryList будет иметь тип платформы , поэтому вы сами решаете, хотите ли вы считать его обнуляемым.
  • Даже если ваша модель написана на Kotlin, а свойство countryList не имеет значения NULL, если вы используете инструмент сериализации, который использует отражение для создания экземпляров моделей (например, Gson), значение nullможет по-прежнему записываться в это свойство, если это то, на что отвечала сеть.

Что касается решения: напечатайте этот список явно как обнуляемый (в случае проблемы с типом платформы, здесь, в вашем коде,иначе в тебеr сетевой модели), а затем выполните нулевые проверки, которые навязывает вам компилятор:

val listCountry: List<Model.Country>? = response!!.body().data.countryList
...
if (listCountry != null) {
    recyclerList.adapter = CustomAdapter(this@MainActivity, listCountry)
} else {
    // handle missing part of network response somehow
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...