我目前正在使用 recyclerview 为 Android 应用程序构建自定义日历。 这个应用程序包含有关日程管理的元素,并且提出了通过recyclerview进行多个日期选择的需求。
recyclerview只保存日历中的数字。所有文本均在 TextView 中制作,并通过 GridLayout 和 LinearLayout 对齐。
Recyclerview适配器代码:
package com.example.mymate
import android.content.Context
import android.graphics.Color
import android.os.Build
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.AdapterView.OnItemClickListener
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.example.mymate.databinding.ListitemCalendarBinding
import java.time.LocalDate
class CalendarAdapter(val context: Context, val dayList: ArrayList<LocalDate?>): RecyclerView.Adapter<CalendarAdapter.DayViewHolder>() {
class DayViewHolder(val binding: ListitemCalendarBinding): RecyclerView.ViewHolder(binding.root) {
fun bind(item: String, color: String) {
val day = binding.dayText
val spend = binding.billText
day.text = item
spend.text = item
//text color
if (color == "blue") {
day.setTextColor(Color.BLUE)
} else if (color == "red") {
day.setTextColor(Color.RED)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DayViewHolder {
val binding = ListitemCalendarBinding.inflate(LayoutInflater.from(context), parent, false)
return DayViewHolder(binding)
}
override fun getItemCount(): Int {
return dayList.size
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: DayViewHolder, position: Int) {
var day = dayList[position]
var daytext = ""
if (dayList[position] == null) {
daytext = ""
} else {
daytext = day?.dayOfMonth.toString()
}
if ((position + 1) % 7 == 0) {
holder.bind(daytext, "blue")
} else if (position == 0 || position % 7 == 0) {
holder.bind(daytext, "red")
} else {
holder.bind(daytext, "black")
}
holder.itemView.setOnClickListener{
var iYear = day?.year
var iMonth = day?.month
var iDay = day?.dayOfMonth
var fullday = day
//TODO: item click event
}
}
}
还没有计划其他功能,因此点击事件实际上是空的。
有什么方法可以获取所选项目的位置以及之前选择的项目的位置吗?我正在努力获取最后选定的位置信息,并通过位置访问该项目以更改所选项目和之前所选项目之间的项目的背景颜色、文本等。
如果我正确理解你的问题,也许是这样?在适配器中声明两个变量:
var beforeSelectedPosition = -1
var lastSelectedPosition = -1
然后在
setOnClickListener
上执行以下操作:
holder.itemView.setOnClickListener{
// Other codes
if(lastSelectedPosition == -1) {
lastSelectedPosition = holder.absoluteAdapterPosition
}else {
beforeSelectedPosition = lastPositionSelected
lastPositionSelected = holder.absoluteAdapterPosition
}
}
无论何时您需要,只需致电
adapter.lastPositionSelected
和 adapter.beforeSelectedPosition
。