我想创建一个徽章并将其附加到从
CardView
内的 xml 布局膨胀的 RecyclerView.ViewHolder
:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MenuItemViewHolder {
val cardView = LayoutInflater.from(parent.context)
.inflate(R.layout.menu_item_card, parent, false)
Log.i("Adapter#onBind", cardView.toString())
val badgeDrawable = BadgeDrawable.create(cardView.context)
badgeDrawable.isVisible = true
BadgeUtils.attachBadgeDrawable(badgeDrawable, cardView)
return MenuItemViewHolder(cardView)
}
布局文件将
CardView
元素嵌套在 ConstraintLayout
下,日志输出确实显示我的 cardView
变量是 ConstraintLayout
而不是 CardView
元素:
androidx.constraintlayout.widget.ConstraintLayout{3789c11 V.E...... ......I. 0,0-0,0}
这是布局文件:
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/card_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
...
</LinearLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
我得到以下 NPE:
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.view.ViewGroup.setClipChildren(boolean)”
这个问题可能是由于在布局尚未膨胀时尝试设置badgeDrawable而发生的。您应该迁移此代码:
val badgeDrawable = BadgeDrawable.create(cardView.context)
badgeDrawable.isVisible = true
BadgeUtils.attachBadgeDrawable(badgeDrawable, cardView)
到您的 Adapter 的 ViewHolder 类并传递必要的上下文参数。然后你可以尝试在 onBindViewHolder() 中为每个项目设置badgeDrawable。