puzhibing
2026-08-21 5fa94b3718b4a78a4fcea4c97652b0ef20b7de3a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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 }
    }
}