区间范围选择器:常用于日期的选择,或者范围的选择 demo展示效果
思路是通过RecycleView进行展示,Item的父布局展示底层淡蓝色的背景,其他的正常展示,代码思路大致参考如下
/**
*
* 区间选择adapter
*
*/
class RangeAdapter(val rangeEntityList: MutableList<RangeEntity>) :
RecyclerView.Adapter<RangeAdapter.RangeViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RangeViewHolder {
val binding =
ItemRangeSelectBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return RangeViewHolder(binding)
}
override fun onBindViewHolder(holder: RangeViewHolder, position: Int) {
holder.bind(rangeEntityList[position])
}
private var rangeSelectStartID: Int = -1
private var rangeSelectEndID: Int = -1
private fun resetSelectType() {
rangeEntityList.forEach { rangeEntity ->
when {
rangeEntity.id < rangeSelectStartID -> rangeEntity.selectType =
RangeEntity.SelectType.SELECT_NO
rangeEntity.id == rangeSelectStartID -> rangeEntity.selectType =
RangeEntity.SelectType.SELECT_RANGE_START
rangeEntity.id in (rangeSelectStartID + 1) until rangeSelectEndID -> rangeEntity.selectType =
RangeEntity.SelectType.SELECT_RANGE_IN
rangeSelectEndID == rangeEntity.id -> rangeEntity.selectType =
RangeEntity.SelectType.SELECT_RANGE_END
rangeSelectEndID < rangeEntity.id -> rangeEntity.selectType =
RangeEntity.SelectType.SELECT_NO
}
}
}
override fun getItemCount(): Int = rangeEntityList.size
@SuppressLint("NotifyDataSetChanged")
inner class RangeViewHolder(val binding: ItemRangeSelectBinding) :
RecyclerView.ViewHolder(binding.root) {
private val rangeNoSelectTextColor = Color.parseColor("#313131")
private val rangeInSelectTextColor = Color.parseColor("#313131")
private lateinit var currentRangeEntity: RangeEntity
init {
binding.root.setOnClickListener {
when {
// rangeSelectStartID == -1 -> { //没有选择,第一次选择
// rangeSelectStartID = currentRangeEntity.id
// rangeSelectEndID = currentRangeEntity.id
// resetSelectType()
// notifyDataSetChanged()
// }
// currentRangeEntity.id <= rangeSelectStartID -> { //选中位置是之前的位置
// rangeSelectStartID = currentRangeEntity.id
// rangeSelectEndID = currentRangeEntity.id
// resetSelectType()
// notifyDataSetChanged()
// }
rangeSelectStartID != -1 && currentRangeEntity.id > rangeSelectStartID && rangeSelectStartID == rangeSelectEndID -> { //选了起始位置,没有选择结束位置
rangeSelectEndID = currentRangeEntity.id
resetSelectType()
notifyDataSetChanged()
}
else -> {
rangeSelectStartID = currentRangeEntity.id
rangeSelectEndID = currentRangeEntity.id
resetSelectType()
notifyDataSetChanged()
}
}
}
}
fun bind(rangeEntity: RangeEntity) {
currentRangeEntity = rangeEntity
binding.tvRange.text = rangeEntity.text
when (rangeEntity.selectType) {
RangeEntity.SelectType.SELECT_NO -> { //没有选中
binding.rlParent.setBackgroundColor(Color.TRANSPARENT)
binding.tvRange.setTextColor(rangeNoSelectTextColor)
binding.tvRange.setBackgroundResource(R.drawable.shape_range_no_select)
}
RangeEntity.SelectType.SELECT_RANGE_START -> {
if (rangeSelectStartID == rangeSelectEndID) {
binding.rlParent.setBackgroundColor(Color.TRANSPARENT)
} else {
binding.rlParent.setBackgroundResource(R.drawable.layer_range_select_start)
}
binding.tvRange.setTextColor(Color.WHITE)
binding.tvRange.setBackgroundResource(R.drawable.shape_range_select)
}
RangeEntity.SelectType.SELECT_RANGE_IN -> {
binding.rlParent.setBackgroundColor(Color.parseColor("#EFF4FF"))
binding.tvRange.setTextColor(rangeInSelectTextColor)
binding.tvRange.setBackgroundColor(Color.TRANSPARENT)
}
RangeEntity.SelectType.SELECT_RANGE_END -> {
binding.rlParent.setBackgroundResource(R.drawable.layer_range_select_end)
binding.tvRange.setTextColor(Color.WHITE)
binding.tvRange.setBackgroundResource(R.drawable.shape_range_select)
}
}
}
}
}