"Недостаточно информации для вывода параметра T" с помощью Kotlin и Android


Я пытаюсь воспроизвести следующий ListView в моем приложении для Android с помощью Kotlin:https://github.com/bidrohi/KotlinListView.

к сожалению, я получаю ошибку, которую я не могу решить сам. Вот мой код:

MainActivity.kt:

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

    val listView = findViewById(R.id.list) as ListView
    listView.adapter = ListExampleAdapter(this)
}

private class ListExampleAdapter(context: Context) : BaseAdapter() {
    internal var sList = arrayOf("Eins", "Zwei", "Drei")
    private  val mInflator: LayoutInflater

    init {
        this.mInflator = LayoutInflater.from(context)
    }

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

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

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

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
        val view: View?
        val vh: ListRowHolder

        if(convertView == null) {
            view = this.mInflator.inflate(R.layout.list_row, parent, false)
            vh = ListRowHolder(view)
            view.tag = vh
        } else {
            view = convertView
            vh = view.tag as ListRowHolder
        }

        vh.label.text = sList[position]
        return view
    }
}

private class ListRowHolder(row: View?) {
    public val label: TextView

    init {
        this.label = row?.findViewById(R.id.label) as TextView
    }
}
}

макеты точно такие же, как здесь: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout

полное сообщение об ошибке я получаю это: Ошибка:(92, 31) Тип вывод ошибка: не достаточно информации, чтобы определить параметр t в удовольствие команду findViewById(Р0: Инт): Т! Пожалуйста, укажите это явно.

Я был бы признателен за любую помощь, которую я могу получить.

5 67

5 ответов:

вы должны использовать API уровня 26 (или выше). Эта версия изменила подпись View.findViewById() см. здесь https://developer.android.com/preview/api-overview.html#fvbi-signature

так что в вашем случае, где результат findViewById неоднозначно, вам нужно указать тип:

1/ Смена

val listView = findViewById(R.id.list) as ListView до

val listView = findViewById<ListView>(R.id.list)

2/ изменения

this.label = row?.findViewById(R.id.label) as TextView к

this.label = row?.findViewById<TextView>(R.id.label) as TextView

обратите внимание, что в 2/ приведение требуется только потому, что row допускает. Если label был слишком пустой, или если вы сделали row не обнуляется, это не требуется.

Andoid O изменить findViewById api от

public View findViewById(int id);

до

public final T findViewById (int id)

Итак, если вы нацелены на API 26, Вы можете изменить

val listView = findViewById (R. id.list) как ListView

до

val listView = findViewById (R. id.list)

или

val listView: ListView = findViewById (R. id.list)

Его Работы

уровень API 25 или ниже используйте это

    var et_user_name = findViewById(R.id.et_user_name) as EditText

уровень API 26 или выше используйте это

    val et_user_name: EditText = findViewById(R.id.et_user_name)

Удачи В Кодировании !

измените свой код на этот. Где произошли основные изменения отмечены звездочками.

package com.phenakit.tg.phenakit

import android.content.Context
import android.os.Bundle
import android.support.design.widget.BottomNavigationView
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import android.widget.TextView

public class MainActivity : AppCompatActivity() {

    private var mTextMessage: TextView? = null

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                mTextMessage!!.setText(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                mTextMessage!!.setText(R.string.title_dashboard)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                setContentView(R.layout.activity_list_view)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

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

        mTextMessage = findViewById(R.id.message) as TextView?
        val navigation = findViewById(R.id.navigation) as BottomNavigationView
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)


        **val listView = findViewById<ListView>(R.id.list)**



        **listView?.adapter = ListExampleAdapter(this)**
    }

    private class ListExampleAdapter(context: Context) : BaseAdapter() {
        internal var sList = arrayOf("Eins", "Zwei", "Drei")
        private  val mInflator: LayoutInflater

        init {
            this.mInflator = LayoutInflater.from(context)
        }

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

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

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

        override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
            val view: View?
            val vh: ListRowHolder

            if(convertView == null) {
                view = this.mInflator.inflate(R.layout.list_row, parent, false)
                vh = ListRowHolder(view)
                view.tag = vh
            } else {
                view = convertView
                vh = view.tag as ListRowHolder
            }

            vh.label.text = sList[position]
            return view
        }
    }

    private class ListRowHolder(row: View?) {
        public var label: TextView

        **init { this.label = row?.findViewById<TextView?>(R.id.label) as TextView }**
    }
}

Я бы предложил вам использовать synthetics Котлин Android расширение:

https://kotlinlang.org/docs/tutorials/android-plugin.html

https://antonioleiva.com/kotlin-android-extensions/

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

init {
   this.label = row.label
}

Так Просто ;)