কোটলিন এবং অ্যান্ড্রয়েডের সাথে "প্যারামিটার টি অনুমান করার জন্য পর্যাপ্ত তথ্য নেই"


110

আমি আমার অ্যান্ড্রয়েড অ্যাপে কোটলিন ব্যবহার করে নিম্নলিখিত লিস্টভিউটি প্রতিলিপি করার চেষ্টা করছি: 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) প্রকারের অনুমান ব্যর্থ হয়েছে: মজাদার প্যারাভিটার টি অনুমান করার জন্য পর্যাপ্ত তথ্য নেই ভিউবিআইআইডি (পি 0 ইনট): টি! দয়া করে এটি স্পষ্টভাবে নির্দিষ্ট করুন।

আমি যে কোনও সহায়তা পেতে পারি তার প্রশংসা করব।


2
আপনি কি এর সাথে পরিবর্তন this.label = ... as TextViewকরে চেষ্টা this.label = row?.findViewById<TextView>করতে পারেন val listView = ...? এটি কাজ করে কিনা দয়া করে আমাকে জানান দয়া করে আমি এই ক্ষেত্রে এটির যথাযথ উত্তর দিতে পারি।
ক্রিশ্চান ব্রাজেগম্যান 16

1
কোন রেখায় ত্রুটি ঘটে?
ভদদান

আপনি একটি ছোট উদাহরণ দিয়ে সমস্যাটি প্রদর্শন করতে পারেন?
ভদদান

@ ক্রিশ্চানব্রিজম্যান এটিকে পছন্দ করুন: i.imgur.com/ZeWKjt5.png এবং এটি: i.imgur.com/Can7w0p.png ? আপনার সম্পাদনাগুলির সাথে এখন এই ত্রুটি রয়েছে: i.imgur.com/qqPAjrL.png
টিমো গন্টনার

1
এটি.এলবেল = সারি? চেষ্টা করুনফাইন্ডভিউবিআইডি <টেক্সটভিউ> (আর.আইডি.লাবেল) টেক্সটভিউ হিসাবে দেখুন
আলফ মোহ

উত্তর:


224

আপনি অবশ্যই এপিআই স্তর 26 (বা উপরে) ব্যবহার করা উচিত। এই সংস্করণটির স্বাক্ষর বদলেছে View.findViewById()- এখানে দেখুন https://developer.android.com/about/versions/oreo/android-8.0-changes#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 / the rowালাইতে কেবল প্রয়োজন হয় কারণ নলাবল। যদি label খুব আক্রান্তও হয়, বা আপনি যদি rowঅযোগ্য না করে থাকেন তবে এটির প্রয়োজন হবে না।


10
এটি কীভাবে ব্যাচ-সমাধান করতে হবে: পাথ রিপ্লেস ইন পাথ ডায়ালগটি খুলুন (সিটিআরএল + শিফট + আর) এবং রেজেক্স বক্সটি চেক করুন। প্রতিস্থাপন findViewById\((.+?)\)\s+as\s+(.+)সঙ্গে findViewById<$2>\($1\)এবং সমস্ত ফাইল প্রতিস্থাপন চালানো। এটি আমার প্রায়শই ত্রুটি সমাধান করেছে।
গুস্তাভ কার্লসন

1
কেন জাভাতে ডিফল্টরূপে ভিউয়ের ধরনটি নির্ধারণ করা যথেষ্ট এবং কোটলিনে পর্যাপ্ত নয় কেন? findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));এটি জাভা জন্য ঠিক আছে।
সার্জ

findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)আমার জন্য আরও ভাল কাজ করে এটি কোনও এক লাইন কোড @
গুস্তাভ

1
লিঙ্কটি এটি বলে না।
অ্যালস্টন

7

এন্ডয়েড হে থেকে ভিভবাইআইডি এপি পরিবর্তন করুন

সর্বজনীন দেখুন FindViewById (আইডি);

প্রতি

সর্বজনীন চূড়ান্ত টি সন্ধান ভিউবিআইআইডি (ইন্ট আইডি)

সুতরাং, আপনি যদি এপিআই 26 তে লক্ষ্য করে থাকেন তবে আপনি পরিবর্তন করতে পারবেন

ভল তালিকার ভিউ = সন্ধান ভিউবিআইআইডি (আর.আইডি.লিস্ট) তালিকাভুক্তি হিসাবে

প্রতি

ভাল তালিকা ভিউ = সন্ধান ভিউবিআইআইডি (আর.আইডি.লিস্ট)

অথবা

ভাল তালিকা ভিউ: তালিকাভিউ = সন্ধান ভিউবিআইআইডি (আর.আইডি.লিস্ট)


4

ইহা কাজ করছে

এপিআই স্তর 25 বা নীচে এটি ব্যবহার করুন

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

এপিআই স্তর 26 বা উপরে এটি ব্যবহার করুন

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

শুভ কোডিং!


2

আপনার কোডটি এতে পরিবর্তন করুন। মূল পরিবর্তনগুলি যেখানে অ্যাসিস্টিস দিয়ে চিহ্নিত করা হয়েছে।

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 }**
    }
}

আপনি যদি আপনার অ্যাপ্লিকেশনটিতে এপিআই 26 কে টার্গেট করে থাকেন তবে নীচের উত্তরটি সঠিক উত্তর। val listView = findViewById<ListView>(R.id.list)
এরিকওয়াসটাক

হ্যাঁ, আপনি ঠিক বলেছেন সংকলকটি বন্ধনীগুলির বিষয়বস্তু থেকে প্রকারটি অনুমান করার কথা। কখনও কখনও এটি ব্যর্থ হয়। আপনার কোডটিও সঠিক। পরিবর্তনগুলি প্রতিফলিত করতে আমার উত্তর আপডেট করবে।
আলফ মোহ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.