IllegalArgumentException по параметру convertView в Adapter.getView Kotlin для Android - PullRequest
0 голосов
/ 05 июня 2018
java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter convertView
Adapter.getView
 at android.widget.AbsListView.obtainView(AbsListView.java:2346)
        at android.widget.ListView.makeAndAddView(ListView.java:1876)
        at android.widget.ListView.fillDown(ListView.java:702)
        at android.widget.ListView.fillFromTop(ListView.java:763)
        at android.widget.ListView.layoutChildren(ListView.java:1671)
        at android.widget.AbsListView.onLayout(AbsListView.java:2148)

Это логкат Android.Я пытался с Java, он работает нормально, базовый адаптер что-то не так в адаптере или другой.Я попытался с public constructor, а также счетчик списка массивов 3 нашел, что я проверил это.Всегда происходит сбой при getView

Код MyAdapter ::

   inner class MyAppAdapter constructor(private val parkingList: ArrayList<App>, private val mContext: Context) : BaseAdapter() {

        override fun getCount(): Int {
            return this.parkingList.size
        }

        override fun getItem(position: Int): Any {
            return position
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getView(position: Int, convertView: View, parent: ViewGroup): View? {
            val viewHolder: ViewHolder
            var rowView: View? = convertView
            if (rowView == null) {
                rowView = LayoutInflater.from(mContext).inflate(R.layout.item_more_apps, parent, false)
                viewHolder = ViewHolder()
                viewHolder.appIcon = rowView.findViewById(R.id.appIcon)
                viewHolder.appName = rowView.findViewById(R.id.appName)
                viewHolder.appDescription = rowView.findViewById(R.id.appDescription)
                rowView.tag = viewHolder
            } else {
                viewHolder = convertView.tag as ViewHolder
            }
            viewHolder.appName!!.text = String.format("%s", this.parkingList[position].name)
            viewHolder.appDescription!!.text = String.format("%s", this.parkingList[position].description)
            Glide.with(applicationContext).load(this.parkingList[position].icon).into(viewHolder.appIcon!!)
            rowView?.setOnClickListener {
                try {
                    startActivity(Intent("android.intent.action.VIEW", Uri.parse("market://details?id=" + this@MyAppAdapter.parkingList[position].link)))
                } catch (e: ActivityNotFoundException) {
                    startActivity(Intent("android.intent.action.VIEW", Uri.parse("http://play.google.com/store/apps/details?id=" + this@MyAppAdapter.parkingList[position].link)))
                }
            }
            return rowView
        }

        inner class ViewHolder {
            var appDescription: TextView? = null
            var appIcon: ImageView? = null
            var appName: TextView? = null
        }
    }

Используется при AsyncTask -> onPostExecute

  myAppAdapter = MyAppAdapter(appArrayList, applicationContext)
            lvPoses!!.adapter = myAppAdapter

Переменная Decleared, как это

   lateinit var myAppAdapter: MyAppAdapter
    private val appArrayList = ArrayList<App>()
    private var lvPoses: ListView? = null

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

У меня были похожие проблемы с Asynctasks, не уверен, поможет ли это вам, но если вы просто выполните asynctask (без .get()).Ваш код после вызова asynctask будет запущен, но элемент по-прежнему равен NULL, поскольку Asynctask еще не выполнялась, а когда это произошло, было уже слишком поздно.Попробуйте добавить .get() после выполнения (это заморозит пользовательский интерфейс, но метод postExecute будет вызван вовремя).Или другой подход состоит в том, чтобы установить логическую переменную false и сделать ее истинной, когда выполнялась запись, затем проверять каждую секунду или около того (Timer, Thread), если переменная равна true, а затем выполнять остальную часть кода.Для лучшего пользовательского интерфейса добавьте диалоги между preExecute и postExecute.

Или вы также можете установить NULL, но я не думаю, что это решит вашу проблему, поскольку вы не хотите, чтобы она была NULL.

0 голосов
/ 05 июня 2018

convertView может быть нулевым, если еще не создано ни одного представления.Исправить объявление параметров:

override fun getView(position: Int, convertView: View?, parent: 
     ViewGroup): View? {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...