android — «Недостаточно информации для вывода параметра T» с Kotlin и Android" />

«Недостаточно информации для вывода параметра 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 (p0: Int): T! Пожалуйста, укажите это явно.

Буду признателен за любую помощь.

71 голос | спросил Timo Güntner 23 J000000Sunday17 2017, 18:53:52

5 ответов


0

Вы должны использовать 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 не обнуляемым, это не потребовалось бы.

ответил nmw 25 J000000Tuesday17 2017, 11:16:13
0

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

  

публичный вид findViewById (int id);

до

  

публичный финал 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)

ответил Trinea 3 PM00000060000003631 2017, 18:34:36
0

Его работа

Уровень 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)

Удачного кодирования!

ответил Keshav Gera 13 12017vEurope/Moscow11bEurope/MoscowMon, 13 Nov 2017 14:57:21 +0300 2017, 14:57:21
0

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

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)
                [email protected] true
            }
            R.id.navigation_dashboard -> {
                mTextMessage!!.setText(R.string.title_dashboard)
                [email protected] true
            }
            R.id.navigation_notifications -> {
                setContentView(R.layout.activity_list_view)
                [email protected] 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 }**
    }
}
ответил Alf Moh 23 J000000Sunday17 2017, 23:26:16
0

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

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

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

В вашем случае код будет примерно таким:

init {
   this.label = row.label
}

Так просто;)

ответил pauminku 12 TueEurope/Moscow2017-12-12T16:35:55+03:00Europe/Moscow12bEurope/MoscowTue, 12 Dec 2017 16:35:55 +0300 2017, 16:35:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132