我使用RecyclerView显示项目列表。我尝试使用标准的RecyclerView而不是我自己的类,问题是相同的。
我的问题是,当片段最初加载时,它似乎没有将数据映射到每个布局项目,因此,我只用铅笔就可以得到这些胖块,如图像视图顶部所示。 如果向下滚动,则会得到正确的布局,其中显示了数据,如图像底部所示。 如果我向下滚动到足以隐藏“错误”项的位置,然后再备份,它们将使用正确的数据正确呈现。
该视图是ConstraintLayout中的以下XML。
<x.y.z.EmptyStateRecyclerView
android:id="@+id/customer_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/customer_item" />
这是课程。
class EmptyStateRecyclerView : RecyclerView {
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
context,
attrs,
defStyle
)
var emptyView: View? by Delegates.observable<View?>(null) { _, _, _ -> updateState() }
private fun updateState() {
if (emptyView != null && adapter != null) {
val empty = adapter.itemCount == 0
visibility = if (!empty) VISIBLE else GONE
emptyView?.visibility = if (empty) VISIBLE else GONE
}
}
private val observer = object : AdapterDataObserver() {
override fun onChanged() {
updateState()
}
}
override fun setAdapter(a: Adapter<*>?) {
adapter?.unregisterAdapterDataObserver(observer)
super.setAdapter(a)
adapter?.registerAdapterDataObserver(observer)
updateState()
}
}