update to the latest version of MyRecyclerView

This commit is contained in:
tibbi 2017-11-16 21:14:30 +01:00
parent 6f90e9c030
commit cd7dcde36f
14 changed files with 70 additions and 251 deletions

View File

@ -47,10 +47,9 @@ ext {
}
dependencies {
compile 'com.simplemobiletools:commons:2.39.5'
compile 'com.simplemobiletools:commons:2.39.9'
compile 'joda-time:joda-time:2.9.9'
compile 'com.facebook.stetho:stetho:1.5.0'
compile 'com.bignerdranch.android:recyclerview-multiselect:0.2'
compile 'com.android.support:multidex:1.0.2'
compile 'com.google.code.gson:gson:2.8.2'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
@ -60,7 +59,7 @@ dependencies {
}
buildscript {
ext.kotlin_version = '1.1.51'
ext.kotlin_version = '1.1.60'
repositories {
mavenCentral()
}

View File

@ -33,9 +33,11 @@ class ManageEventTypesActivity : SimpleActivity(), DeleteEventTypesListener {
private fun getEventTypes() {
dbHelper.getEventTypes {
runOnUiThread {
manage_event_types_list.adapter = EventTypeAdapter(this, it, this) {
val adapter = EventTypeAdapter(this, it, this, manage_event_types_list) {
showEventTypeDialog(it as EventType)
}
adapter.setupDragListener(true)
manage_event_types_list.adapter = adapter
}
}
}

View File

@ -49,9 +49,7 @@ class WidgetListConfigureActivity : SimpleActivity() {
if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
finish()
mEventsAdapter = EventListAdapter(this, getListItems(), null) {
}
mEventsAdapter = EventListAdapter(this, getListItems(), false, null, config_events_list) {}
mEventsAdapter!!.updateTextColor(mTextColor)
config_events_list.adapter = mEventsAdapter

View File

@ -1,14 +1,17 @@
package com.simplemobiletools.calendar.adapters
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.dialogs.DeleteEventDialog
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.shareEvents
import com.simplemobiletools.calendar.helpers.Formatter
import com.simplemobiletools.calendar.interfaces.DeleteEventsListener
import com.simplemobiletools.calendar.models.Event
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.beInvisible
import com.simplemobiletools.commons.extensions.beInvisibleIf
@ -16,21 +19,24 @@ import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.event_item_day_view.view.*
class DayEventsAdapter(activity: SimpleActivity, val events: List<Event>, val listener: DeleteEventsListener?, recyclerView: MyRecyclerView,
itemClick: (Any) -> Unit) : MyAdapter(activity, itemClick) {
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private val config = activity.config
private var allDayString = resources.getString(R.string.all_day)
private var replaceDescriptionWithLocation = config.replaceDescription
init {
setDragListenerRecyclerView(recyclerView)
selectableItemCount = events.count()
}
override fun getActionMenuId() = R.menu.cab_day
override fun getSelectableItemCount() = events.size
override fun prepareActionMode(menu: Menu) {}
override fun markItemSelection(select: Boolean, pos: Int) {
itemViews[pos].event_item_frame.isSelected = select
override fun prepareItemSelection(view: View) {}
override fun markItemSelection(select: Boolean, view: View?) {
view?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
@ -40,19 +46,14 @@ class DayEventsAdapter(activity: SimpleActivity, val events: List<Event>, val li
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.event_item_day_view, parent, false)
return createViewHolder(view)
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.event_item_day_view, parent)
override fun onBindViewHolder(holder: MyAdapter.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val event = events[position]
val view = holder.bindView(event) {
setupView(it, event)
}
itemViews.put(position, view)
toggleItemSelection(selectedPositions.contains(position), position)
holder.itemView.tag = holder
bindViewHolder(holder, position, view)
}
override fun getItemCount() = events.size

View File

@ -1,25 +1,30 @@
package com.simplemobiletools.calendar.adapters
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.dialogs.DeleteEventDialog
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.shareEvents
import com.simplemobiletools.calendar.helpers.Formatter
import com.simplemobiletools.calendar.interfaces.DeleteEventsListener
import com.simplemobiletools.calendar.models.ListEvent
import com.simplemobiletools.calendar.models.ListItem
import com.simplemobiletools.calendar.models.ListSection
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.extensions.applyColorFilter
import com.simplemobiletools.commons.extensions.beInvisible
import com.simplemobiletools.commons.extensions.beInvisibleIf
import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.event_list_item.view.*
import java.util.*
class EventListAdapter(activity: SimpleActivity, val listItems: List<ListItem>, val listener: DeleteEventsListener?, itemClick: (Any) -> Unit) :
MyAdapter(activity, itemClick) {
class EventListAdapter(activity: SimpleActivity, val listItems: List<ListItem>, val allowLongClick: Boolean, val listener: DeleteEventsListener?,
recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private val config = activity.config
private val ITEM_EVENT = 0
private val ITEM_HEADER = 1
@ -30,12 +35,18 @@ class EventListAdapter(activity: SimpleActivity, val listItems: List<ListItem>,
private val now = (System.currentTimeMillis() / 1000).toInt()
private val todayDate = Formatter.getDayTitle(activity, Formatter.getDayCodeFromTS(now))
init {
selectableItemCount = listItems.filter { it is ListEvent }.size
}
override fun getActionMenuId() = R.menu.cab_event_list
override fun getSelectableItemCount() = listItems.filter { it is ListEvent }.size
override fun prepareActionMode(menu: Menu) {}
override fun markItemSelection(select: Boolean, pos: Int) {
itemViews[pos]?.event_item_frame?.isSelected = select
override fun prepareItemSelection(view: View) {}
override fun markItemSelection(select: Boolean, view: View?) {
view?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
@ -45,23 +56,21 @@ class EventListAdapter(activity: SimpleActivity, val listItems: List<ListItem>,
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyAdapter.ViewHolder {
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyRecyclerViewAdapter.ViewHolder {
val layoutId = if (viewType == ITEM_EVENT) R.layout.event_list_item else R.layout.event_list_section
val view = activity.layoutInflater.inflate(layoutId, parent, false)
return createViewHolder(view)
return createViewHolder(layoutId, parent)
}
override fun onBindViewHolder(holder: MyAdapter.ViewHolder, position: Int) {
override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
val listItem = listItems[position]
val view = holder.bindView(listItem) {
val view = holder.bindView(listItem, allowLongClick) {
if (listItem is ListSection) {
setupListSection(it, listItem, position)
} else if (listItem is ListEvent) {
setupListEvent(it, listItem)
}
}
itemViews.put(position, view)
toggleItemSelection(selectedPositions.contains(position), position)
bindViewHolder(holder, position, view)
}
override fun getItemCount() = listItems.size

View File

@ -1,28 +1,40 @@
package com.simplemobiletools.calendar.adapters
import android.view.Menu
import android.view.View
import android.view.ViewGroup
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.interfaces.DeleteEventTypesListener
import com.simplemobiletools.calendar.models.EventType
import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.extensions.setBackgroundWithStroke
import com.simplemobiletools.commons.models.RadioItem
import com.simplemobiletools.commons.views.MyRecyclerView
import kotlinx.android.synthetic.main.item_event_type.view.*
import java.util.*
class EventTypeAdapter(activity: SimpleActivity, val eventTypes: List<EventType>, val listener: DeleteEventTypesListener?, itemClick: (Any) -> Unit) :
MyAdapter(activity, itemClick) {
class EventTypeAdapter(activity: SimpleActivity, val eventTypes: List<EventType>, val listener: DeleteEventTypesListener?, recyclerView: MyRecyclerView,
itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, itemClick) {
private val config = activity.config
init {
selectableItemCount = eventTypes.size
}
override fun getActionMenuId() = R.menu.cab_event_type
override fun getSelectableItemCount() = eventTypes.size
override fun prepareActionMode(menu: Menu) {}
override fun markItemSelection(select: Boolean, pos: Int) {
itemViews[pos].event_item_frame.isSelected = select
override fun prepareItemSelection(view: View) {}
override fun markItemSelection(select: Boolean, view: View?) {
view?.event_item_frame?.isSelected = select
}
override fun actionItemPressed(id: Int) {
@ -31,18 +43,14 @@ class EventTypeAdapter(activity: SimpleActivity, val eventTypes: List<EventType>
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyAdapter.ViewHolder {
val view = activity.layoutInflater.inflate(R.layout.item_event_type, parent, false)
return createViewHolder(view)
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = createViewHolder(R.layout.item_event_type, parent)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val eventType = eventTypes[position]
val view = holder.bindView(eventType) {
setupView(it, eventType)
}
itemViews.put(position, view)
toggleItemSelection(selectedPositions.contains(position), position)
bindViewHolder(holder, position, view)
}
override fun getItemCount() = eventTypes.size

View File

@ -1,198 +0,0 @@
package com.simplemobiletools.calendar.adapters
import android.support.v7.view.ActionMode
import android.support.v7.widget.RecyclerView
import android.util.SparseArray
import android.view.Menu
import android.view.MenuItem
import android.view.View
import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback
import com.bignerdranch.android.multiselector.MultiSelector
import com.bignerdranch.android.multiselector.SwappingHolder
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.config
import com.simplemobiletools.commons.interfaces.MyAdapterListener
import com.simplemobiletools.commons.views.MyRecyclerView
import java.util.*
abstract class MyAdapter(val activity: SimpleActivity, val itemClick: (Any) -> Unit) : RecyclerView.Adapter<MyAdapter.ViewHolder>() {
protected val config = activity.config
protected val resources = activity.resources!!
protected var primaryColor = config.primaryColor
protected var textColor = config.textColor
protected val itemViews = SparseArray<View>()
protected val selectedPositions = HashSet<Int>()
private val multiSelector = MultiSelector()
private var actMode: ActionMode? = null
private var myRecyclerView: MyRecyclerView? = null
abstract fun getActionMenuId(): Int
abstract fun getSelectableItemCount(): Int
abstract fun markItemSelection(select: Boolean, pos: Int)
abstract fun actionItemPressed(id: Int)
protected fun toggleItemSelection(select: Boolean, pos: Int) {
if (select) {
if (itemViews[pos] != null) {
selectedPositions.add(pos)
}
} else {
selectedPositions.remove(pos)
}
markItemSelection(select, pos)
if (selectedPositions.isEmpty()) {
finishActMode()
return
}
updateTitle(selectedPositions.size)
}
private fun updateTitle(cnt: Int) {
actMode?.title = "$cnt / ${getSelectableItemCount()}"
actMode?.invalidate()
}
protected fun setDragListenerRecyclerView(recyclerView: MyRecyclerView) {
myRecyclerView = recyclerView
myRecyclerView!!.setupDragListener(object : MyRecyclerView.MyDragListener {
override fun selectItem(position: Int) {
selectItemPosition(position)
}
override fun selectRange(initialSelection: Int, lastDraggedIndex: Int, minReached: Int, maxReached: Int) {
selectItemRange(initialSelection, lastDraggedIndex, minReached, maxReached)
}
})
}
fun selectItemPosition(pos: Int) {
toggleItemSelection(true, pos)
}
fun selectItemRange(from: Int, to: Int, min: Int, max: Int) {
if (from == to) {
(min..max).filter { it != from }.forEach { toggleItemSelection(false, it) }
return
}
if (to < from) {
for (i in to..from) {
toggleItemSelection(true, i)
}
if (min > -1 && min < to) {
(min until to).filter { it != from }.forEach { toggleItemSelection(false, it) }
}
if (max > -1) {
for (i in from + 1..max) {
toggleItemSelection(false, i)
}
}
} else {
for (i in from..to) {
toggleItemSelection(true, i)
}
if (max > -1 && max > to) {
(to + 1..max).filter { it != from }.forEach { toggleItemSelection(false, it) }
}
if (min > -1) {
for (i in min until from) {
toggleItemSelection(false, i)
}
}
}
}
fun finishActMode() {
actMode?.finish()
}
fun updateTextColor(textColor: Int) {
this.textColor = textColor
notifyDataSetChanged()
}
private val adapterListener = object : MyAdapterListener {
override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
toggleItemSelection(select, position)
}
override fun getSelectedPositions() = selectedPositions
override fun itemLongClicked(position: Int) {
myRecyclerView?.setDragSelectActive(position)
}
}
private val multiSelectorMode = object : ModalMultiSelectorCallback(multiSelector) {
override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {
actionItemPressed(item.itemId)
return true
}
override fun onCreateActionMode(actionMode: ActionMode?, menu: Menu?): Boolean {
super.onCreateActionMode(actionMode, menu)
actMode = actionMode
activity.menuInflater.inflate(getActionMenuId(), menu)
return true
}
override fun onPrepareActionMode(actionMode: ActionMode?, menu: Menu) = true
override fun onDestroyActionMode(actionMode: ActionMode?) {
super.onDestroyActionMode(actionMode)
selectedPositions.forEach {
markItemSelection(false, it)
}
selectedPositions.clear()
actMode = null
}
}
protected fun createViewHolder(view: View) = ViewHolder(view, adapterListener, activity, multiSelectorMode, multiSelector, itemClick)
class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity, val multiSelectorCallback: ModalMultiSelectorCallback,
val multiSelector: MultiSelector, val itemClick: (Any) -> (Unit)) : SwappingHolder(view, multiSelector) {
fun bindView(any: Any, callback: (itemView: View) -> Unit): View {
return itemView.apply {
callback(this)
if (isClickable) {
setOnClickListener { viewClicked(any) }
setOnLongClickListener { viewLongClicked(); true }
} else {
setOnClickListener(null)
setOnLongClickListener(null)
}
}
}
private fun viewClicked(any: Any) {
if (multiSelector.isSelectable) {
val isSelected = adapterListener.getSelectedPositions().contains(adapterPosition)
adapterListener.toggleItemSelectionAdapter(!isSelected, adapterPosition)
} else {
itemClick(any)
}
}
private fun viewLongClicked() {
if (!multiSelector.isSelectable) {
activity.startSupportActionMode(multiSelectorCallback)
adapterListener.toggleItemSelectionAdapter(true, adapterPosition)
}
adapterListener.itemLongClicked(adapterPosition)
}
}
}

View File

@ -1,16 +1,15 @@
package com.simplemobiletools.calendar.extensions
import android.app.Activity
import com.simplemobiletools.calendar.BuildConfig
import com.simplemobiletools.calendar.R
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.helpers.IcsExporter
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getFilePublicUri
import com.simplemobiletools.commons.extensions.shareUri
import com.simplemobiletools.commons.extensions.toast
import java.io.File
fun SimpleActivity.shareEvents(ids: List<Int>) {
fun BaseSimpleActivity.shareEvents(ids: List<Int>) {
val file = getTempFile()
if (file == null) {
toast(R.string.unknown_error_occurred)
@ -26,7 +25,7 @@ fun SimpleActivity.shareEvents(ids: List<Int>) {
}
}
fun Activity.getTempFile(): File? {
fun BaseSimpleActivity.getTempFile(): File? {
val folder = File(cacheDir, "events")
if (!folder.exists()) {
if (!folder.mkdir()) {

View File

@ -141,6 +141,7 @@ class DayFragment : Fragment(), DBHelper.EventUpdateListener, DeleteEventsListen
val eventsAdapter = DayEventsAdapter(activity as SimpleActivity, events, this, mHolder.day_events) {
editEvent(it as Event)
}
eventsAdapter.setupDragListener(true)
mHolder.day_events.adapter = eventsAdapter
DividerItemDecoration(context, DividerItemDecoration.VERTICAL).apply {

View File

@ -91,7 +91,7 @@ class EventListFragment : Fragment(), DBHelper.EventUpdateListener, DeleteEvents
listItems.add(ListEvent(it.id, it.startTS, it.endTS, it.title, it.description, it.getIsAllDay(), it.color, it.location))
}
val eventsAdapter = EventListAdapter(activity as SimpleActivity, listItems, this) {
val eventsAdapter = EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list) {
if (it is ListEvent) {
editEvent(it)
}

View File

@ -1,10 +1,10 @@
package com.simplemobiletools.calendar.helpers
import com.simplemobiletools.calendar.activities.SimpleActivity
import com.simplemobiletools.calendar.extensions.dbHelper
import com.simplemobiletools.calendar.extensions.writeLn
import com.simplemobiletools.calendar.helpers.IcsExporter.ExportResult.*
import com.simplemobiletools.calendar.models.Event
import com.simplemobiletools.commons.activities.BaseSimpleActivity
import com.simplemobiletools.commons.extensions.getFileOutputStream
import java.io.BufferedWriter
import java.io.File
@ -17,7 +17,7 @@ class IcsExporter {
private var eventsExported = 0
private var eventsFailed = 0
fun exportEvents(activity: SimpleActivity, file: File, events: ArrayList<Event>, callback: (result: ExportResult) -> Unit) {
fun exportEvents(activity: BaseSimpleActivity, file: File, events: ArrayList<Event>, callback: (result: ExportResult) -> Unit) {
activity.getFileOutputStream(file) {
if (it == null) {
callback(EXPORT_FAIL)

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
<com.simplemobiletools.commons.views.MyRecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/manage_event_types_list"

View File

@ -6,7 +6,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/calendar_events_list"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@ -8,7 +8,7 @@
android:layout_centerHorizontal="true"
android:layout_margin="@dimen/activity_margin">
<android.support.v7.widget.RecyclerView
<com.simplemobiletools.commons.views.MyRecyclerView
android:id="@+id/config_events_list"
android:layout_width="match_parent"
android:layout_height="match_parent"