我只是在这里报告一个 Kotlin 版本的kinsley kajiva 响应。
注意:这个版本使用了data biding,所以记得在app build.gradle上启用它:
android {
...
buildFeatures {
dataBinding true
}
}
PojoOfJsonArray.kt
data class PojoOfJsonArray(
val name: String,
val date: String
)
MainActivity.kt
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.list.setHasFixedSize(true)
val myOptions = listOf(
PojoOfJsonArray("name 1", "2016-06-21"),
PojoOfJsonArray("name 2", "2016-06-05"),
PojoOfJsonArray("name 2", "2016-06-05"),
PojoOfJsonArray("name 3", "2016-05-17"),
PojoOfJsonArray("name 3", "2016-05-17"),
PojoOfJsonArray("name 3", "2016-05-17"),
PojoOfJsonArray("name 3", "2016-05-17"),
PojoOfJsonArray("name 2", "2016-06-05"),
PojoOfJsonArray("name 3", "2016-05-17")
)
val groupedMapMap: Map<String, List<PojoOfJsonArray>> = myOptions.groupBy {
it.date
}
val consolidatedList = mutableListOf<ListItem>()
for (date:String in groupedMapMap.keys){
consolidatedList.add(DateItem(date))
val groupItems: List<PojoOfJsonArray>? = groupedMapMap[date]
groupItems?.forEach {
consolidatedList.add(GeneralItem(it.name))
}
}
val adapter = Adapter(consolidatedList)
val layoutManager = LinearLayoutManager(this)
layoutManager.orientation = LinearLayoutManager.VERTICAL
binding.list.layoutManager = layoutManager
binding.list.adapter = adapter
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/general_item"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
ListItem.kt
open class ListItem(
val type: Int
) {
companion object {
const val TYPE_DATE = 0
const val TYPE_GENERAL = 1
}
}
GeneralItem.kt
class GeneralItem(
var name: String,
) : ListItem(TYPE_GENERAL)
DateItem.kt
class DateItem(
val date: String
) : ListItem(TYPE_DATE)
Adapter.kt
class Adapter(
private val items: List<ListItem>,
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater = LayoutInflater.from(parent.context)
return when (viewType) {
ListItem.TYPE_DATE ->
DateViewHolder(DateItemBinding.inflate(layoutInflater))
else ->
GeneralViewHolder(GeneralItemBinding.inflate(layoutInflater))
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder.itemViewType) {
ListItem.TYPE_DATE -> (holder as DateViewHolder).bind(
item = items[position] as DateItem,
)
ListItem.TYPE_GENERAL -> (holder as GeneralViewHolder).bind(
item = items[position] as GeneralItem
)
}
}
override fun getItemViewType(position: Int): Int {
return items[position].type
}
override fun getItemCount(): Int {
return items.size
}
inner class DateViewHolder(val binding: DateItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: DateItem) {
binding.txtDate.text = item.date
}
}
inner class GeneralViewHolder(val binding: GeneralItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: GeneralItem) {
binding.txtTitle.text = item.name
}
}
}
date_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="01/01/2021"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
general_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
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">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Name"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>