android - 如何在 Kotlin 中创建通用适配器?

标签 android kotlin android-room

我有 3 个相似的适配器,我想将它们合并为 1 个。唯一不同的是 ArrayList 类型。我有 2 个房间实体,即 room、FavoriteArticle 和 HistoryArticle,但它们具有与 WikiPage 相同的字段。

class Adapter<T> (@LayoutRes private val layoutRes: Int) : RecyclerView.Adapter<Holder>() {

val currentResult: ArrayList<T> = ArrayList()

override fun getItemCount() = currentResult.size

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    val cardItem = LayoutInflater.from(parent.context).inflate(layoutRes, parent, false)
    return Holder(cardItem)
}

override fun onBindViewHolder(holder: Holder, position: Int) {
    val page = currentResult[position]
    holder.updateWithPage(page)
}

fun add(wiki: ArrayList<T>?) { {
     currentResult.clear()
     if (wiki != null) {
         currentResult.addAll(wiki)
     }
 }

}

持有者类别:

class Holder(itemView: View) : RecyclerView.ViewHolder(itemView) {

private val articleImageView: ImageView = itemView.findViewById(R.id.articleCardItemImage)
private val titleTextView: TextView = itemView.findViewById(R.id.articleCardItemTitle)
private lateinit var currentPage: WikiPage

init {
    itemView.setOnClickListener {
        itemView.context.startActivity(ArticleDetailActivity.createStartIntent(itemView.context, currentPage))
    }
}

fun updateWithPage(page: WikiPage) {
    currentPage = page
    titleTextView.text = page.title
        Picasso.get().load(page.thumbnail.source).into(articleImageView)
}

}

我不知道如何使用泛型从 onBindViewHolder 修改 updateWithPage 函数。我怎样才能做到这一点?

最佳答案

使用Interface的一些想法供您引用:

interface Article {
    getWikiPage(): WikiPage
}

class FavoriteArticle : Article {
    getWikiPage() = wikiPage
}

class HistoryArticle: Article {
    getWikiPage() = wikiPage
}

// Adapter
class Adapter<Article>
...
override fun onBindViewHolder(holder: Holder, position: Int) {
    val page = currentResult[position].getWikiPage()
    holder.updateWithPage(page)
}
...

关于android - 如何在 Kotlin 中创建通用适配器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071356/

相关文章:

java - 多个父类(super class)和代码重用

安卓实时数据 : Not receiving all notifications

java - 在 Java 中包装 C++ 模块

Android Room 自动迁移?

android - 分页库未向我的 PagedListAdapter 发送任何数据

java - 如何使线性布局出现在 GridView 中?

java - 如何让 Stripe Checkout 在 Android WebView 中继续进行?

android - 在 Android 导航组件中检索目的地的深层链接

kotlin - 主函数和常规函数有什么区别?

database - Room @Query 注释字符串字段不带引号