【问题标题】:java.lang.ClassCastException: CustomAdapter cannot be cast to android.widget.ArrayAdapter In Kotlinjava.lang.ClassCastException:在 Kotlin 中无法将 CustomAdapter 强制转换为 android.widget.ArrayAdapter
【发布时间】:2018-05-16 05:16:02
【问题描述】:

当我尝试在 Kotlin 中创建自定义适配器类时遇到上述错误

源代码

MainActivity.kt

 var adapterC:CustomAdapter = CustomAdapter(this,Statearray)
 spinnerState.adapter=adapterC

CustomAdapter.kt

class CustomAdapter(val activity: Activity,val array:JSONArray) : BaseAdapter(), ListAdapter
{
    lateinit var ItemName: TextView

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
    var view=convertView
    if (view == null)
        view = activity.layoutInflater.inflate(R.layout.spinnerlayout, null)
    try {

        ItemName = view?.findViewById(R.id.ItemName) as TextView
        val obj = array.getJSONObject(position)
        ItemName.setText(obj.getString("Name"))
        view.setTag(obj.getString("Id"))

    } catch ( e:JSONException) {
        Log.e("At Custom Class",e.toString())
    }

    return view
}

override fun getItem(position: Int): JSONObject {
    return array.optJSONObject(position)
}

override fun getItemId(position: Int): Long {
    var jsonObject=getItem(position)
    return jsonObject.optLong("id")
}

override fun getCount(): Int {
    return array.length()
}

}

需要帮助我不知道我做错了什么。

【问题讨论】:

  • 你在哪里设置适配器?发布该代码
  • 您的CustomAdapter 没有扩展ArrayAdapter。理解:大象不能被扔给鸟,因为它不会延伸鸟。虽然鹰可以被投射到鸟身上,因为它确实延伸了鸟。

标签: android kotlin android-adapter baseadapter listadapter


【解决方案1】:

我终于弄明白了.. 问题是,我使用了一个只支持 ArrayAdapter 的微调库

我使用的库是

com.toptoche.searchablespinner:searchablespinnerlibrary:1.3.1

只支持arrayadapter

【讨论】:

  • 你使用这个库实现了数据绑定吗?
【解决方案2】:

ClassCastException

抛出以指示代码已尝试将对象强制转换为 它不是实例的子类。

仅供参考

您添加了 Multiple Adapter。删除第二个。

不要

class CustomAdapter(val activity: Activity,val array:JSONArray) : BaseAdapter(), ListAdapter

class CustomAdapter(context: Context,var arrayLIST: ArrayList<Response>) : BaseAdapter() {

演示

var arrayLIST: ArrayList<Response>? = null

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

        arrayLIST=ArrayList()
        val jsonObj = ("[{\"Id\":\"35\",\"Name\":\"Kerala\"},{\"Id\":\"36\",\"Name\":\"Tamilnadu\"}]")
        val jo = JSONArray(jsonObj)
        val num = 0 until jo.length()
        for (i in num) {
            val loanObj = jo.getJSONObject(i)
            val Id      = loanObj.getString("Id")
            val Name    = loanObj.getString("Name")

            arrayLIST!!.add(Response(Id,Name))


        }
      var adapterC:CustomAdapter = CustomAdapter(this@MainActivity,arrayLIST)

Response.kt

data class Response
(
        @SerializedName("id")               val id               : String,
        @SerializedName("name")            val  name             : String
)

注意

确保添加,

   implementation "com.google.code.gson:gson:2.3.0"
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"

【讨论】:

  • 感谢您的重播,但我在这里没有使用 recyclerview。它是微调器……不要误会我的意思……我可以将回收器视图适配器与微调器一起使用吗?
  • @AjithMadhu 您是否关注了上述链接?顺便告诉我们Statearray
  • [{"Id":"35","Name":"Kerala"},{"Id":"36","Name":"泰米尔纳德邦"}]
  • 非常感谢您为我花费宝贵的时间......我非常抱歉犯了这种愚蠢的错误......thanx ..
猜你喜欢
  • 1970-01-01
  • 2022-07-15
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
相关资源
最近更新 更多