-
Notifications
You must be signed in to change notification settings - Fork 51
/
NestedSmartRecyclerAdaptersActivity.kt
162 lines (151 loc) · 7.05 KB
/
NestedSmartRecyclerAdaptersActivity.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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
package smartrecycleradapter.feature
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_simple_item.recyclerView
import smartadapter.Position
import smartadapter.SmartRecyclerAdapter
import smartadapter.nestedadapter.SmartNestedAdapterBinder
import smartadapter.viewevent.dragdrop.AutoDragAndDropBinder
import smartadapter.viewevent.listener.OnClickEventListener
import smartadapter.viewevent.listener.OnLongClickEventListener
import smartrecycleradapter.BuildConfig
import smartrecycleradapter.R
import smartrecycleradapter.extension.GridAutoLayoutManager
import smartrecycleradapter.models.CopyrightModel
import smartrecycleradapter.models.MovieCategory
import smartrecycleradapter.models.MovieData
import smartrecycleradapter.models.MovieModel
import smartrecycleradapter.utils.AssetsUtils
import smartrecycleradapter.viewholder.ActionMoviesViewHolder
import smartrecycleradapter.viewholder.AdventureMoviesViewHolder
import smartrecycleradapter.viewholder.AnimatedMoviesViewHolder
import smartrecycleradapter.viewholder.BannerViewHolder
import smartrecycleradapter.viewholder.ComingSoonMoviesViewHolder
import smartrecycleradapter.viewholder.CopyrightViewHolder
import smartrecycleradapter.viewholder.LargeThumbViewHolder
import smartrecycleradapter.viewholder.MyWatchListViewHolder
import smartrecycleradapter.viewholder.NestedRecyclerViewHolder
import smartrecycleradapter.viewholder.RecentlyPlayedMoviesViewHolder
import smartrecycleradapter.viewholder.SciFiMoviesViewHolder
import smartrecycleradapter.viewholder.SmallThumbViewHolder
import smartrecycleradapter.viewholder.ThumbViewHolder
import java.util.Locale
/*
* Created by Manne Öhlund on 2019-08-14.
* Copyright (c) All rights reserved.
*/
class NestedSmartRecyclerAdaptersActivity : BaseSampleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportActionBar?.title = "Nested SmartRecyclerAdapters"
initSmartRecyclerAdapter()
}
private fun initSmartRecyclerAdapter() {
val movieData: MovieData = AssetsUtils.loadStyleFromAssets(this, "simple-movie-data.json")
val items = movieData.categories as MutableList<Any>
items.add(
CopyrightModel(
"SmartRecyclerAdapter v${BuildConfig.VERSION_NAME}\n\nDeveloped by Manne Öhlund"
)
)
SmartRecyclerAdapter
.items(items)
.map(CopyrightModel::class, CopyrightViewHolder::class)
.setViewTypeResolver { item, position ->
when (item) {
is MovieCategory -> when (item.type) {
"movie" -> when (item.id) {
"coming-soon" -> ComingSoonMoviesViewHolder::class
"watch-list" -> MyWatchListViewHolder::class
"action" -> ActionMoviesViewHolder::class
"adventure" -> AdventureMoviesViewHolder::class
"anim" -> AnimatedMoviesViewHolder::class
"sci-fi" -> SciFiMoviesViewHolder::class
"recent" -> RecentlyPlayedMoviesViewHolder::class
else -> null
}
"banner" -> BannerViewHolder::class
else -> null
}
else -> null
}
}
.setLayoutManager(LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false).apply {
isItemPrefetchEnabled = true
initialPrefetchItemCount = 20
})
.add(
SmartNestedAdapterBinder(
viewHolderType = NestedRecyclerViewHolder::class,
recyclerViewBinder = { viewHolder, recyclerView ->
when (viewHolder) {
is RecentlyPlayedMoviesViewHolder -> recyclerView.layoutManager = GridAutoLayoutManager(this, 60)
else -> recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false).apply {
isItemPrefetchEnabled = true
initialPrefetchItemCount = 20
}
}
recyclerView.setHasFixedSize(true)
recyclerView.isNestedScrollingEnabled = false
},
smartRecyclerAdapterBuilder = SmartRecyclerAdapter.empty()
.map(MovieModel::class, ThumbViewHolder::class)
.setViewTypeResolver { item, position ->
when (item) {
is MovieModel -> {
when (item.size) {
MovieModel.LARGE -> LargeThumbViewHolder::class
MovieModel.SMALL -> SmallThumbViewHolder::class
else -> ThumbViewHolder::class
}
}
else -> null
}
}
.add(OnClickEventListener {
showToast(
"%s \nindex %d",
getMovieTitle(it.adapter, it.position),
it.position
)
})
.add(OnLongClickEventListener {
showToast(
"%s \nindex: %d",
getMovieTitle(it.adapter, it.position),
it.position
)
it.adapter.removeItem(it.position)
})
.add(AutoDragAndDropBinder(
dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN,
longPressDragEnabled = true,
viewHolderTypes = listOf(
ThumbViewHolder::class
)
) {
})
)
)
.add(OnClickEventListener(NestedRecyclerViewHolder::class, R.id.more) {
showToast("More clicked at ${it.position}")
})
.into<SmartRecyclerAdapter>(recyclerView)
}
private fun getMovieTitle(
smartRecyclerAdapter: SmartRecyclerAdapter,
position: Position
): String {
val movieModel = smartRecyclerAdapter.getItem(position) as MovieModel
return movieModel.title
}
fun showToast(format: String, vararg args: Any) {
Toast.makeText(
this,
String.format(Locale.ENGLISH, format, *args),
Toast.LENGTH_LONG
).show()
}
}