Android 区间选择思路

106 阅读1分钟

区间范围选择器:常用于日期的选择,或者范围的选择 demo展示效果

ScreenTexView.gif

思路是通过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)
                }

            }
        }
    }

}