在这种情况下,我认为最好有一个支持多种类型项目的回收器视图适配器。
您拨打的separators 将是sections
例子:
sealed class Item {
data class Section(val sectionText): Item
data class Purchases(.......): Item
}
适配器:
class MyAdapter(private val items: List<Item>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
const val TYPE_PURCHASES = 0
const val TYPE_SECTION = 1
}
override fun getItemViewType(position: Int): Int {
val type = when (items[position]) {
is Items.Section -> TYPE_SECTION
// other types...
else -> TYPE_PURCHASES
}
return type
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val viewHolder: RecyclerView.ViewHolder = when (viewType) {
TYPE_PURCHASES -> {}
// other view holders...
else -> {}
}
return viewHolder
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
when(holder) {
is SectionViewHolder -> bindSectionViewHolder(holder)
is PurchasesViewHolder -> bindSectionViewHolder(holder)
}
}
override fun getItemCount() = items.size
}
然后为每个type创建对应的ViewHolders,并在onCreateViewHolder处实例化它们。
当您在适配器中传递项目列表时,您应该具有将部分或项目添加到列表中的逻辑。
我的一个项目中的类似示例:
.subscribeBy(onSuccess = {
val list = mutableListOf<IViewModel>()
val previousBookingDate = Calendar.getInstance()
val bookingDate = Calendar.getInstance()
it.data?.fold(Date(0)) { previousHeader, bookable ->
previousBookingDate.time = previousHeader
bookingDate.time = bookable.getStartDate()
val timeIgnoringComparator = DateUtils.TimeIgnoringComparator()
if (timeIgnoringComparator.compare(previousBookingDate, bookingDate) != 0) {
list.add(SectionViewModel(bookable.getStartDate(), isDefaultSearch || isDefaultCenterSelected()))
}
list.add(BookableItemViewModel(bookable))
bookable.getStartDate()
}
searchResultsLiveData.value = list
}, onError = {
isError.setValue(Event(Pair(null, Runnable { performSearch() })))
})
我建议查看this 库,以快速制作具有不同项目类型的列表。