标签:android android-recyclerview android-viewholder
我想制作通用适配器,让我重用它.这就是为什么我决定不通过膨胀来创建视图,而是将自定义的,先前创建的视图传递给onCreateViewHolder中ListAdapter(RecyclerView)中的ViewHolder.根据其文档,它应该是可能的,因为它说:
You can either create a new View manually or inflate it from an XML layout file.
这是我的适配器实现:
class BaseAdapter<T, V : View>(
private val adapterConfig: AdapterConfig<T, V>,
private val onClick: (T) -> (Unit)
) : ListAdapter<T, BaseViewHolder<V>>(adapterConfig.diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder<V> {
return adapterConfig.viewHolder.apply {
itemView.setOnClickListener { onClick(getItem(adapterPosition)) }
}
}
override fun onBindViewHolder(holder: BaseViewHolder<V>, position: Int) {
adapterConfig.bind(getItem(position), holder, position)
}
}
AdapterConfig实现类可用于创建ViewHolder,它看起来像这样:
override val viewHolder: BaseViewHolder<ScorerView> = BaseViewHolder(ScorerView(context))
BaseViewHolder类:
class BaseViewHolder<out V : View>(val v: V) : RecyclerView.ViewHolder(v)
(直到现在都没什么有趣的)
我的ScorerView是:
class ScorerView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
init {
LayoutInflater.from(context).inflate(R.layout.item_ranking, this, false)
}
fun configure(id: String, player: String, team: String, matchSet: String, points: String, pointsAvg: String) {
idTextView.text = id
playerTextView.text = player
teamTextView.text = team
matchSetTextView.text = matchSet
pointsTextView.text = points
pointsAvgTextView.text = pointsAvg
}
}
问题是,当我将false传递给inflate函数时(这是好的,因为RecyclerView要求项目视图没有附加到根视图),那么我的widget实例(例如idTextView)为null.否则,当我通过传递true或通过调用addView(view)手动将视图附加到root时,我发现崩溃时说该视图在创建时无法附加:
ViewHolder views must not be attached when created. Ensure that you are not passing ‘true’ to the attachToRoot parameter of LayoutInflater.inflate(…, boolean attachToRoot)
我的问题是:它甚至可能吗?如果没有,为什么官方文档说可以手动创建视图?
解决方法:
问题是你一遍又一遍地返回相同的视图.明确要求onCreateViewHolder()每次调用时都会创建一个新视图.
文档说您可以手动创建View,但这仍然意味着每次onCreateViewHolder()运行时都手动创建一个不同的视图.
因此,因为您每次都重复使用相同的视图,所以第二次应用程序调用onCreateViewHolder()时,视图已经附加到父视图.
标签:android,android-recyclerview,android-viewholder 来源: https://codeday.me/bug/20190627/1304622.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。