package com.xw.yunwei.ui.user.mine.scheduling.adapter
|
|
import android.view.LayoutInflater
|
import android.view.View
|
import android.view.ViewGroup
|
import android.widget.LinearLayout
|
import android.widget.TextView
|
import androidx.recyclerview.widget.RecyclerView
|
import com.xw.yunwei.R
|
import java.time.DayOfWeek
|
import java.time.LocalDate
|
import java.time.temporal.ChronoUnit
|
import java.time.temporal.TemporalAdjusters
|
import kotlin.math.abs
|
|
|
//一周日期适配器
|
class WeekPagerAdapter(
|
var startDate: LocalDate,
|
var endDate: LocalDate,
|
) : RecyclerView.Adapter<WeekPagerAdapter.WeekViewHolder>() {
|
private var showStartSundayDate: LocalDate =
|
startDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
|
private var showEndSundayDate: LocalDate =
|
endDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))
|
|
//选中日期
|
var selectDate: LocalDate? = null
|
set(value) {
|
field?.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))?.let {
|
ChronoUnit.WEEKS.between(startDate, it)
|
}?.takeIf { it > 0 }?.also {
|
notifyItemChanged(it.toInt())
|
}
|
field = value
|
field?.with(TemporalAdjusters.previousOrSame(DayOfWeek.SUNDAY))?.let {
|
ChronoUnit.WEEKS.between(startDate, it)
|
}?.takeIf { it > 0 }?.also {
|
notifyItemChanged(it.toInt())
|
}
|
}
|
|
//日期item点击事件
|
private var onDateItemClickListener: ((date: LocalDate) -> Unit)? = null
|
|
//设置日期item点击事件
|
fun setOnDateItemClickListener(onDateItemClickListener: ((date: LocalDate) -> Unit)) {
|
this.onDateItemClickListener = onDateItemClickListener
|
}
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): WeekViewHolder {
|
val inflate =
|
LayoutInflater.from(parent.context).inflate(R.layout.item_date_week, parent, false)
|
return WeekViewHolder(inflate)
|
}
|
|
override fun onBindViewHolder(holder: WeekViewHolder, position: Int) {
|
val localDate = getItem(position)
|
onBindViewHolder(holder, localDate)
|
}
|
|
//获取显示的LocalDate
|
fun getItem(position: Int): LocalDate {
|
return startDate.plusWeeks(position.toLong())
|
}
|
|
private fun onBindViewHolder(holder: WeekViewHolder, date: LocalDate) {
|
// 遍历 7 天,更新每个 TextView
|
for (i in 0 until 7) {
|
val localDate = date.plusDays(i.toLong())
|
holder.children[i].setOnClickListener {
|
selectDate = localDate
|
onDateItemClickListener?.invoke(localDate)
|
}
|
holder.textViews[i].text = localDate.dayOfMonth.toString()
|
holder.textViews[i].isSelected = localDate == selectDate
|
}
|
}
|
|
override fun getItemCount() =
|
abs(ChronoUnit.WEEKS.between(showStartSundayDate, showEndSundayDate).toInt())
|
|
class WeekViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
val children = arrayOf(
|
itemView.findViewById<LinearLayout>(R.id.ll_date1)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date2)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date3)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date4)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date5)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date6)!!,
|
itemView.findViewById<LinearLayout>(R.id.ll_date7)!!,
|
)
|
val textViews: List<TextView> = children.map { it.getChildAt(0) as TextView }
|
}
|
}
|