@@ -9,15 +9,22 @@ import androidx.paging.PagedList
9
9
import androidx.paging.PagedListAdapter
10
10
import androidx.recyclerview.widget.DiffUtil
11
11
import androidx.recyclerview.widget.RecyclerView.NO_ID
12
- import net.gotev.recycleradapter.AdapterItem
13
- import net.gotev.recycleradapter.RecyclerAdapterViewHolder
14
- import net.gotev.recycleradapter.castAsIn
15
- import net.gotev.recycleradapter.viewType
12
+ import net.gotev.recycleradapter.*
16
13
17
14
class PagingAdapter (
18
- dataSource : () -> DataSource <* , * >,
19
- config : PagedList .Config
20
- ) : PagedListAdapter<AdapterItem<*>, RecyclerAdapterViewHolder>(diffCallback) {
15
+ dataSource : () -> DataSource <* , * >,
16
+ config : PagedList .Config
17
+ ) : PagedListAdapter<AdapterItem<*>, RecyclerAdapterViewHolder>(diffCallback), RecyclerAdapterNotifier {
18
+
19
+ companion object {
20
+ val diffCallback = object : DiffUtil .ItemCallback <AdapterItem <* >>() {
21
+ override fun areItemsTheSame (oldItem : AdapterItem <* >, newItem : AdapterItem <* >) =
22
+ oldItem == newItem
23
+
24
+ override fun areContentsTheSame (oldItem : AdapterItem <* >, newItem : AdapterItem <* >) =
25
+ ! oldItem.hasToBeReplacedBy(oldItem)
26
+ }
27
+ }
21
28
22
29
private val dataSourceFactory: DataSourceFactory <Any > = DataSourceFactory (dataSource)
23
30
private val data = LivePagedListBuilder <Any , AdapterItem <* >>(dataSourceFactory, config).build()
@@ -34,43 +41,50 @@ class PagingAdapter(
34
41
}
35
42
36
43
override fun onCreateViewHolder (parent : ViewGroup , viewType : Int ) = currentList
37
- ?.find { it.viewType() == viewType }
38
- ?.createItemViewHolder(parent)
39
- ? : throw IllegalStateException (" Item not found" )
44
+ ?.find { it.viewType() == viewType }
45
+ ?.createItemViewHolder(parent)
46
+ ? : throw IllegalStateException (" Item not found" )
40
47
41
48
override fun onBindViewHolder (holder : RecyclerAdapterViewHolder , position : Int ) {
42
49
bindItem(holder, position, true )
43
50
}
44
51
45
52
override fun onBindViewHolder (
46
- holder : RecyclerAdapterViewHolder ,
47
- position : Int ,
48
- payloads : MutableList <Any >
53
+ holder : RecyclerAdapterViewHolder ,
54
+ position : Int ,
55
+ payloads : MutableList <Any >
49
56
) {
50
57
bindItem(holder, position, payloads.isEmpty())
51
58
}
52
59
53
60
override fun getItemViewType (position : Int ) = getItem(position).viewType()
54
61
55
62
override fun getItemId (position : Int ) =
56
- getItem(position)?.diffingId()?.hashCode()?.toLong() ? : NO_ID
63
+ getItem(position)?.diffingId()?.hashCode()?.toLong() ? : NO_ID
57
64
58
65
fun reload () {
59
66
data.value?.dataSource?.invalidate()
60
67
}
61
68
62
69
private fun bindItem (holder : RecyclerAdapterViewHolder , position : Int , firstTime : Boolean ) {
63
- getItem(position)?.castAsIn()?.bind(firstTime, holder)
64
- ? : throw IllegalStateException (" Item not found" )
70
+ getItem(position)?.let {
71
+ holder.setAdapter(this )
72
+ it.castAsIn().bind(firstTime, holder)
73
+ } ? : throw IllegalStateException (" Item not found" )
65
74
}
66
75
67
- companion object {
68
- val diffCallback = object : DiffUtil .ItemCallback <AdapterItem <* >>() {
69
- override fun areItemsTheSame (oldItem : AdapterItem <* >, newItem : AdapterItem <* >) =
70
- oldItem == newItem
76
+ override fun getAdapterItem (holder : RecyclerAdapterViewHolder ): AdapterItem <* >? {
77
+ val list = currentList ? : return null
78
+ val position = holder.adapterPosition.takeIf { it >= 0 && it < list.size } ? : return null
71
79
72
- override fun areContentsTheSame (oldItem : AdapterItem <* >, newItem : AdapterItem <* >) =
73
- ! oldItem.hasToBeReplacedBy(oldItem)
74
- }
80
+ return list[position]
81
+ }
82
+
83
+ override fun selected (holder : RecyclerAdapterViewHolder ) {
84
+ // TODO: not implemented yet
85
+ }
86
+
87
+ override fun notifyItemChanged (holder : RecyclerAdapterViewHolder ) {
88
+ // TODO: not implemented yet
75
89
}
76
90
}
0 commit comments