How to create a generic Adapter in Kotlin?

我们两清 提交于 2020-01-24 15:04:28

问题


I have 3 similars adapters and I want to combine them in 1. The only thing that is different is the ArrayList type. I have 2 room entities for room, FavoriteArticle, and HistoryArticle, but they have the same fields as 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)
     }
 }

}

Holder class:

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

}

I can't figure out how to modify my updateWithPage function from onBindViewHolder using generics. How can I do this?


回答1:


Some idea for your reference by using 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)
}
...



来源:https://stackoverflow.com/questions/59071356/how-to-create-a-generic-adapter-in-kotlin

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!