android - 带有粘性标题和子标题的 Recyclerview
问题描述
如何创建带有粘性标题和子标题(recyclerview 结构)的 recyclerView 适配器?一开始我确实喜欢这个例子,使用 FlexibleAdapter 制作。在示例中,只有粘性标题。
数据类 SectionItem(private val title: String, private val headerItem: HeaderItem) :
AbstractFlexibleItem(),
ISectionable {
override fun getLayoutRes(): Int = R.layout.section
override fun getHeader(): HeaderItem = headerItem
override fun setHeader(headerItem: HeaderItem) {
}
override fun createViewHolder(view: View?, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>?): ViewHolder = ViewHolder(view, adapter)
override fun bindViewHolder(adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>?, holder: ViewHolder?, position: Int, payloads: MutableList<Any>?) {
holder?.let {
it.title.text = title
}
}
class ViewHolder(view: View?, adapter: FlexibleAdapter<*>?) : FlexibleViewHolder(view, adapter) {
var title: TextView = view?.findViewById(R.id.title)!!
}}
在 SectionItem 中,我无法使用 subHeader 实现 ISectionable。在查看了 FlexibleAdapter 库的文档后,我认为不可能创建带有子标题的列表结构。请告诉有什么其他方法可以制作一个与recyclerview 结构匹配的子标题。
解决方案
我猜你的模型有一些关于日期的数据。如果我猜对了,你必须创建 3 个不同的 ViewHolders:
- StickyHeader 的 ViewHolder
- 子标题的 ViewHolder
- 您的 json 项目的 ViewHolder
现在创建将接受List<YourJsonObject>
列表的方法。在该方法中,您将不得不遍历该列表并检查您的模型的日期。在那里,您应该设置一些逻辑来检查以前的YourJsonObject
日期。
val newList = mutableListOf<SomeKindOfInterface>()
fun setData(list: List<YourJsonObject>) {
newList.clear()
var previousMonth = 0
var previousDay = 0
for (yourJsonObject in list) {
if (yourJsonObject.month != previousMonth) {
previousMonth = yourJsonObject.month
newList.add(MonthObject(yourJsonObject.month))
}
if (yourJsonObject.day != previousDay) {
previousDay = yourJsonObject.day
newList.add(DayObject(yourJsonObject.day))
}
newList.add(yourJsonObject)
}
}
class YourJsonObject(
val month: Int,
val day: Int
) : SomeKindOfInterface
class MonthObject(val month: Int) : SomeKindOfInterface
class DayObject(val day: Int) : SomeKindOfInterface
interface SomeKindOfInterface
之后,您应该覆盖getItemViewType(position: Int)
and onCreateViewHolder(parent: ViewGroup, viewType: Int)
。根据您的数据,根据项目位置newList
返回不同的 ViewType。
override fun getItemViewType(position: Int): Int {
return when (newList.get(position)) {
is YourJsonObject -> 0
is MonthObject -> 1
is DayObject -> 2
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when (viewType) {
0 -> createYourJsonObjectViewHolder
1 -> createMonthObjectViewHolder
2 -> createDayObjectViewHolder
}
}
当然,我在这里给您的代码只是示例,但是有了这些信息,您应该可以将其应用于您的问题。
MonthObject
是你的 StickyHeader 并且DayObject
是你的 SubHeader。
推荐阅读
- machine-learning - 我们可以只使用 model.fit 而不是 model.fit_generator 吗?
- python - 如何在 CSV 文件中关联来自网络抓取的特定行?
- java - 如何在 Android MainActivity 类中实现线程?
- spring - Spring reactor doOnNext,它正在执行吗?
- javascript - 设置内容类型nodejs的最佳方法
- c# - 尝试在 gridview 中编辑行(C# ASP.NET MVC)
- r - R的switch语句不是特殊形式,是不是很慢?
- qgis - 导入 qgis 的航拍图像歪了
- jpa - JPA - 如何将相同的查询添加到存储库两次
- python - 删除直到特定行的所有行