In my application I want create custom calendar with RecyclerView
and for this I write below codes.
I want set black color for today and next days and set gray color for previous days.
I can know which day is today, but I don't know how can I get today's position in adapter for set gray color!
My Adapter color:
class DaysAdapter constructor(val context: Context, private val items: MutableList<DayEntity>) :
RecyclerView.Adapter<DaysAdapter.ViewHolder>() {
private val TYPE_HEADER = 0
private val TYPE_DAY = 1
private var firstDayDayOfWeek = 0
private var totalDays = 0
init {
firstDayDayOfWeek = items[0].dayOfWeek
totalDays = items.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return ViewHolder(inflater.inflate(R.layout.item_day_new, parent, false))
}
override fun getItemCount() = 7 * 7
override fun getItemViewType(position: Int): Int {
return if (isPositionHeader(position)) {
TYPE_HEADER
} else {
TYPE_DAY
}
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(position)
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val dayTxt = itemView.findViewById(R.id.dayTxt) as TextView
//Bind data
fun bind(pos: Int) {
var position = pos
position = 6 - (position % 7) * 2
if (totalDays < position - 6 - firstDayDayOfWeek) {
return
} else {
//Day
if (!isPositionHeader(position)) {
if (position - 7 - firstDayDayOfWeek >= 0) {
val day = items[position - 7 - firstDayDayOfWeek]
dayTxt.isVisible = true
dayTxt.text = day.num
items[position].dayOfWeek
//Today
if (position < day.isToday) {
dayTxt.setTextColor(ContextCompat.getColor(context, R.color.gray))
} else {
dayTxt.setTextColor(ContextCompat.getColor(context, R.color.black))
}
} else {
dayTxt.isVisible = false
}
} else {
//Header
dayTxt.text = Constants.FIRST_CHAR_OF_DAYS_OF_WEEK_NAME[position]
}
}
}
}
private fun isPositionHeader(position: Int) = position < 7
}
day.isToday
is boolean and but I don't how can I completed this code if (position < day.isToday)
for set gray color.
day.isToday
is Boolean and I can't used it in if (position < day.isToday)
.
day.isToday
is Boolean and I can't used it in if (position < day.isToday)
.
How can I it?
CodePudding user response:
Update You can use the Calendar class to get the current date and then compare it with the date of the days that you want to color. Based on the comparison you can set the color of the days.
val calendar = Calendar.getInstance()
val currentDay = calendar.get(Calendar.DAY_OF_MONTH)
if (dayOfMonth < currentDay) {
// Previous days
textView.setTextColor(Color.GRAY)
} else {
// Today and next days
textView.setTextColor(Color.BLACK)
}
OLD you can try this where you are comparing position with day.IsToday in bind() method just simply try the below code
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val dayTxt = itemView.findViewById(R.id.dayTxt) as TextView
//Bind data
fun bind(pos: Int) {
var position = pos
position = 6 - (position % 7) * 2
if (totalDays < position - 6 - firstDayDayOfWeek) {
return
} else {
//Day
if (!isPositionHeader(position)) {
if (position - 7 - firstDayDayOfWeek >= 0) {
val day = items[position - 7 - firstDayDayOfWeek]
dayTxt.isVisible = true
dayTxt.text = day.num
items[position].dayOfWeek
//Today
if (items[position].isToday) {
dayTxt.setTextColor(ContextCompat.getColor(context, R.color.gray))
} else {
dayTxt.setTextColor(ContextCompat.getColor(context, R.color.black))
}
} else {
dayTxt.isVisible = false
}
} else {
//Header
dayTxt.text =
Constants.FIRST_CHAR_OF_DAYS_OF_WEEK_NAME[position]
}
}
}
}
CodePudding user response:
I am assuming
items[position].isToday
this function will identify your date is today or not.
Now simply get today position and store it some where globally like
Int todayPosition=-1 // note take it globally, where it will not over-right every time.
if(items[position].isToday){
todayPosition=position
}
Now you have to just compare position
if(position==todayPosition){
//Today colour
}else if(position <todayPosition){
//Past colour
}else{
//Future colour
}
Hope this will help you.