mirror of
https://github.com/SimpleMobileTools/Simple-Calendar.git
synced 2025-06-05 21:59:17 +02:00
allow adding section headers to the list
This commit is contained in:
@ -5,12 +5,18 @@ import android.view.LayoutInflater
|
|||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.BaseAdapter
|
import android.widget.BaseAdapter
|
||||||
|
import android.widget.TextView
|
||||||
import com.simplemobiletools.calendar.Formatter
|
import com.simplemobiletools.calendar.Formatter
|
||||||
import com.simplemobiletools.calendar.R
|
import com.simplemobiletools.calendar.R
|
||||||
import com.simplemobiletools.calendar.models.Event
|
import com.simplemobiletools.calendar.models.ListEvent
|
||||||
|
import com.simplemobiletools.calendar.models.ListItem
|
||||||
|
import com.simplemobiletools.calendar.models.ListSection
|
||||||
import kotlinx.android.synthetic.main.event_item.view.*
|
import kotlinx.android.synthetic.main.event_item.view.*
|
||||||
|
|
||||||
class EventsListAdapter(context: Context, private val mEvents: List<Event>) : BaseAdapter() {
|
class EventsListAdapter(context: Context, private val mEvents: List<ListItem>) : BaseAdapter() {
|
||||||
|
val ITEM_EVENT = 0
|
||||||
|
val ITEM_HEADER = 1
|
||||||
|
|
||||||
private val mInflater: LayoutInflater
|
private val mInflater: LayoutInflater
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@ -20,30 +26,50 @@ class EventsListAdapter(context: Context, private val mEvents: List<Event>) : Ba
|
|||||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
|
||||||
var view = convertView
|
var view = convertView
|
||||||
val viewHolder: ViewHolder
|
val viewHolder: ViewHolder
|
||||||
|
val type = getItemViewType(position)
|
||||||
|
|
||||||
if (view == null) {
|
if (view == null) {
|
||||||
|
if (type == ITEM_EVENT) {
|
||||||
view = mInflater.inflate(R.layout.event_item, parent, false)
|
view = mInflater.inflate(R.layout.event_item, parent, false)
|
||||||
viewHolder = ViewHolder(view)
|
viewHolder = ViewHolder(view)
|
||||||
|
} else {
|
||||||
|
view = mInflater.inflate(R.layout.event_section, parent, false)
|
||||||
|
viewHolder = ViewHolder(view)
|
||||||
|
}
|
||||||
view!!.tag = viewHolder
|
view!!.tag = viewHolder
|
||||||
} else {
|
} else {
|
||||||
viewHolder = view.tag as ViewHolder
|
viewHolder = view.tag as ViewHolder
|
||||||
}
|
}
|
||||||
|
|
||||||
val event = mEvents[position]
|
if (type == ITEM_EVENT) {
|
||||||
|
val item = mEvents[position] as ListEvent
|
||||||
viewHolder.apply {
|
viewHolder.apply {
|
||||||
title.text = event.title
|
title.text = item.title
|
||||||
description.text = event.description
|
description?.text = item.description
|
||||||
start.text = Formatter.getTime(event.startTS)
|
start?.text = Formatter.getTime(item.startTS)
|
||||||
|
|
||||||
if (event.startTS == event.endTS) {
|
if (item.startTS == item.endTS) {
|
||||||
end.visibility = View.INVISIBLE
|
end?.visibility = View.INVISIBLE
|
||||||
} else {
|
} else {
|
||||||
end.text = Formatter.getTime(event.endTS)
|
end?.text = Formatter.getTime(item.endTS)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
val item = mEvents[position] as ListSection
|
||||||
|
viewHolder.title.text = item.title
|
||||||
|
}
|
||||||
|
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getItemViewType(position: Int): Int {
|
||||||
|
return if (mEvents[position] is ListEvent) ITEM_EVENT else ITEM_HEADER
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getViewTypeCount(): Int {
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
override fun getCount(): Int {
|
override fun getCount(): Int {
|
||||||
return mEvents.size
|
return mEvents.size
|
||||||
}
|
}
|
||||||
@ -53,13 +79,13 @@ class EventsListAdapter(context: Context, private val mEvents: List<Event>) : Ba
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemId(position: Int): Long {
|
override fun getItemId(position: Int): Long {
|
||||||
return 0
|
return position.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
class ViewHolder(view: View) {
|
class ViewHolder(view: View) {
|
||||||
val title = view.event_item_title
|
val title = view.event_item_title
|
||||||
val description = view.event_item_description
|
val description: TextView? = view.event_item_description
|
||||||
val start = view.event_item_start
|
val start: TextView? = view.event_item_start
|
||||||
val end = view.event_item_end
|
val end: TextView? = view.event_item_end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,14 @@ import android.view.View
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import com.simplemobiletools.calendar.DBHelper
|
import com.simplemobiletools.calendar.DBHelper
|
||||||
import com.simplemobiletools.calendar.R
|
import com.simplemobiletools.calendar.R
|
||||||
import com.simplemobiletools.calendar.adapters.EventsAdapter
|
import com.simplemobiletools.calendar.adapters.EventsListAdapter
|
||||||
import com.simplemobiletools.calendar.models.Event
|
import com.simplemobiletools.calendar.models.Event
|
||||||
|
import com.simplemobiletools.calendar.models.ListEvent
|
||||||
|
import com.simplemobiletools.calendar.models.ListItem
|
||||||
import kotlinx.android.synthetic.main.fragment_event_list.view.*
|
import kotlinx.android.synthetic.main.fragment_event_list.view.*
|
||||||
import org.joda.time.DateTime
|
import org.joda.time.DateTime
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.comparisons.compareBy
|
||||||
|
|
||||||
class EventListFragment : Fragment(), DBHelper.GetEventsListener {
|
class EventListFragment : Fragment(), DBHelper.GetEventsListener {
|
||||||
lateinit var mView: View
|
lateinit var mView: View
|
||||||
@ -28,7 +32,11 @@ class EventListFragment : Fragment(), DBHelper.GetEventsListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun gotEvents(events: MutableList<Event>) {
|
override fun gotEvents(events: MutableList<Event>) {
|
||||||
val eventsAdapter = EventsAdapter(context, events)
|
val listItems = ArrayList<ListItem>(events.size)
|
||||||
|
val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }))
|
||||||
|
sorted.forEach { listItems.add(ListEvent(it.id, it.startTS, it.endTS, it.title, it.description)) }
|
||||||
|
|
||||||
|
val eventsAdapter = EventsListAdapter(context, listItems)
|
||||||
activity?.runOnUiThread {
|
activity?.runOnUiThread {
|
||||||
mView.calendar_events_list.adapter = eventsAdapter
|
mView.calendar_events_list.adapter = eventsAdapter
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.simplemobiletools.calendar.models
|
||||||
|
|
||||||
|
class ListEvent(var id: Int = 0, var startTS: Int = 0, var endTS: Int = 0, var title: String = "", var description: String = "") : ListItem() {
|
||||||
|
override fun toString(): String {
|
||||||
|
return "Event {id=$id, startTS=$startTS, endTS=$endTS, title=$title, description=$description}"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
package com.simplemobiletools.calendar.models
|
||||||
|
|
||||||
|
open class ListItem
|
@ -0,0 +1,7 @@
|
|||||||
|
package com.simplemobiletools.calendar.models
|
||||||
|
|
||||||
|
class ListSection(val title: String, val isToday: Boolean) : ListItem() {
|
||||||
|
override fun toString(): String {
|
||||||
|
return "ListSection {title=$title, isToday=$isToday}"
|
||||||
|
}
|
||||||
|
}
|
7
app/src/main/res/layout/event_section.xml
Normal file
7
app/src/main/res/layout/event_section.xml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<TextView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/event_item_title"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:textSize="@dimen/day_text_size"/>
|
Reference in New Issue
Block a user