【问题标题】:Kotlin: Type mismatch (RecyclerView.Adapter<RecyclerView.ViewHolder>)Kotlin:类型不匹配(RecyclerView.Adapter<RecyclerView.ViewHolder>)
【发布时间】:2019-11-23 22:47:42
【问题描述】:

我是使用 Kotlin 的新手,我尝试将我的项目从 java 移植到 kotlin。基本上,我有一个帮助类尝试初始化 recyclerview 布局、适配器等。

在java中: 适配器

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>
{
  ...
  public static class ViewHolder extends RecyclerView.ViewHolder
  {
    ...
  }
  ...
}

我的辅助函数:

public void init(RecyclerView recyclerView, boolean horizontal, boolean divider, RecyclerView.Adapter adapter, Context context)

当我创建适配器并调用函数时,它工作正常。

但是在 Kotlin 中: 适配器

class MyAdapter(...) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
  ...
  inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    ...
  }
  ...
}

辅助函数

fun init(recyclerView : RecyclerView, horizontal: Boolean, divider: Boolean, adapter: RecyclerView.Adapter<RecyclerView.ViewHolder>, context: Context) {
  ...
}

当我创建适配器并调用函数时

val myAdapter = MyAdapter(...)
helper.init(listView, false, false, myAdapter, this)

我在需要的地方遇到不匹配错误:RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt; 并找到:MyAdapter

继承明智,它应该有效吗?还是我错过了什么?

谢谢!

【问题讨论】:

  • 你在哪里调用这个函数?问题是在您的情况、活动或片段中,this 是谁?
  • 嗨,“这个”是指活动

标签: android kotlin android-recyclerview


【解决方案1】:

不完全是,您需要的正确声明是:

class MyAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() 

然后您需要实现诸如此签名之类的方法:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder

等等

onCreateViewHolder 必须返回 ViewHolder 或其子类,例如

return ItemViewHolder(view)

在哪里:-

inner class ItemViewHolder(val mView: View) : RecyclerView.ViewHolder(mView)
{
  val mFieldView: TextView = mView.field
  ...
}

你可以在绑定函数中使用这些知识,例如

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
{
  val itemHolder = holder as ItemViewHolder
  val item = dataModel[position]
  itemHolder.mFieldView.text = item.field
}

【讨论】:

  • 嗨!谢谢你的回答,我覆盖了所有的方法,但我只是没有把它放在我的sn-ps上。你的答案是正确的,我应该只继承 RecyclerView.Adapter&lt;RecyclerView.ViewHolder&gt;() 而不是内部的 ViewHolder 类。而且你的 ViewHolder 和 binditem 的方式更好,我刚刚了解到 Kotlin 有这么简单的方法(stackoverflow.com/questions/44192550/…)。谢谢!
【解决方案2】:

查看您使用的适配器类型,有不同类型的适配器,如数组适配器、recyclerView 适配器。具体来说,在列表视图中,我们使用数组适配器。而使用recycler View 适配器是recycler view 适配器,如果你使用array adapter 和recycler view 会出现上述错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多