allow adding section headers to the list

This commit is contained in:
tibbi
2016-10-23 12:01:07 +02:00
parent f5e0bf81d7
commit 3f267ba8ed
6 changed files with 77 additions and 19 deletions

View File

@ -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
} }
} }

View File

@ -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
} }

View File

@ -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}"
}
}

View File

@ -0,0 +1,3 @@
package com.simplemobiletools.calendar.models
open class ListItem

View File

@ -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}"
}
}

View 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"/>