-
Notifications
You must be signed in to change notification settings - Fork 33
/
ReorderListActivity.kt
140 lines (116 loc) · 5.13 KB
/
ReorderListActivity.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.yelp.android.bentosampleapp
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.yelp.android.bento.componentcontrollers.RecyclerViewComponentController
import com.yelp.android.bento.components.ListComponent
import com.yelp.android.bento.components.OnItemMovedCallback
import com.yelp.android.bento.core.Component
import com.yelp.android.bento.core.ComponentGroup
import com.yelp.android.bento.core.ComponentViewHolder
import com.yelp.android.bento.core.setOnDragStartListener
import com.yelp.android.bento.utils.inflate
import com.yelp.android.bentosampleapp.components.LabeledComponent
import com.yelp.android.bentosampleapp.components.LabeledComponentViewHolder
import com.yelp.android.bentosampleapp.databinding.ActivityRecyclerViewBinding
class ReorderListActivity : AppCompatActivity(), Presenter {
private lateinit var binding: ActivityRecyclerViewBinding
private val componentController by lazy {
RecyclerViewComponentController(binding.recyclerView)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityRecyclerViewBinding.inflate(layoutInflater)
setContentView(binding.root)
addUnorderableListComponent()
addLongPressOrderableListComponent()
addHandleOrderableListComponent()
addReorderAllButLast()
}
private fun addUnorderableListComponent() {
componentController.addComponent(LabeledComponent("No reorder"))
val list = ListComponent(Unit, LabeledComponentViewHolder::class.java, 2)
list.toggleDivider(false)
list.setData((0..10).map { it.toString() })
componentController.addComponent(list)
}
private fun addLongPressOrderableListComponent() {
componentController.addComponent(LabeledComponent("Long press to reorder"))
val longPressComponent = ListComponent(Unit, LabeledComponentViewHolder::class.java, 2)
longPressComponent.setIsReorderable(true)
longPressComponent.toggleDivider(false)
longPressComponent.setData((0..10).map { 'a'.plus(it).toString() })
longPressComponent.setOnItemMovedCallback(object : OnItemMovedCallback<String> {
override fun onItemMoved(oldIndex: Int, newIndex: Int) {
Log.i("Reordered", "Item at $oldIndex moved to $newIndex")
}
})
componentController.addComponent(longPressComponent)
}
private fun addHandleOrderableListComponent() {
val handleComponent =
ListComponent(this, ReorderViewHolder::class.java, 2)
handleComponent.setIsReorderable(true)
handleComponent.toggleDivider(false)
handleComponent.setData((0..10).map { 'A'.plus(it).toString() })
handleComponent.setOnItemMovedCallback(object : OnItemMovedCallback<String> {
override fun onItemMoved(oldIndex: Int, newIndex: Int) {
Log.i("Reordered", "Item at $oldIndex moved to $newIndex")
}
})
val componentGroup = ComponentGroup().apply {
addComponent(LabeledComponent("Drag handle to reorder"))
addComponent(handleComponent)
}
componentController.addComponent(componentGroup)
}
private fun addReorderAllButLast() {
componentController.addComponent(LabeledComponent("Reorder all but the last, fixed, item"))
componentController.addComponent(ReorderAllButLastComponent())
}
override fun onStartDrag(viewHolder: ComponentViewHolder<Presenter, String>) {
componentController.onItemPickedUp(viewHolder)
}
}
interface Presenter {
fun onStartDrag(viewHolder: ComponentViewHolder<Presenter, String>)
}
class ReorderViewHolder : ComponentViewHolder<Presenter, String>() {
private lateinit var text: TextView
private lateinit var presenter: Presenter
override fun inflate(parent: ViewGroup): View {
return parent.inflate<View>(R.layout.reorderable_view_holder).also {
text = it.findViewById(R.id.textview)
it.findViewById<View>(R.id.handle).setOnDragStartListener {
presenter.onStartDrag(this)
}
}
}
override fun bind(presenter: Presenter, element: String) {
text.text = element
this.presenter = presenter
}
}
class ReorderAllButLastComponent : Component() {
val data = (0 until 10).toMutableList()
override fun getPresenter(position: Int) = Unit
override fun getItem(position: Int) = if (position == count - 1) {
"Last Item. Can't move"
} else {
data[position].toString()
}
override fun getCount(): Int = data.size
override fun getHolderType(position: Int) = LabeledComponentViewHolder::class.java
override fun onItemsMoved(fromIndex: Int, toIndex: Int) {
data.add(toIndex, data.removeAt(fromIndex))
}
override fun canDropItem(fromIndex: Int, toIndex: Int): Boolean {
return toIndex != count - 1
}
override fun canPickUpItem(index: Int): Boolean {
return index != count - 1
}
}