@ -59,9 +59,20 @@ class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteracto
old [ oldItemPosition ] . guid == new [ newItemPosition ] . guid
override fun areContentsTheSame ( oldItemPosition : Int , newItemPosition : Int ) : Boolean =
oldMode :: class = = newMode :: class & &
old [ oldItemPosition ] in oldMode . selectedItems == new [ newItemPosition ] in newMode . selectedItems &&
old [ oldItemPosition ] . title == new [ newItemPosition ] . title &&
old [ oldItemPosition ] . url == new [ newItemPosition ] . url
old [ oldItemPosition ] == new [ newItemPosition ]
override fun getChangePayload ( oldItemPosition : Int , newItemPosition : Int ) : Any ? {
val oldItem = old [ oldItemPosition ]
val newItem = new [ newItemPosition ]
return BookmarkPayload (
titleChanged = oldItem . title != newItem . title ,
urlChanged = oldItem . url != newItem . url ,
selectedChanged = oldItem in oldMode . selectedItems != newItem in newMode . selectedItems ,
modeChanged = oldMode :: class ! = newMode :: class
)
}
override fun getOldListSize ( ) : Int = old . size
override fun getNewListSize ( ) : Int = new . size
@ -90,9 +101,36 @@ class BookmarkAdapter(val emptyView: View, val interactor: BookmarkViewInteracto
override fun getItemCount ( ) : Int = tree . size
override fun onBindViewHolder (
holder : BookmarkNodeViewHolder ,
position : Int ,
payloads : MutableList < Any >
) {
if ( payloads . isNotEmpty ( ) && payloads [ 0 ] is BookmarkPayload ) {
holder . bind ( tree [ position ] , mode , payloads [ 0 ] as BookmarkPayload )
} else {
super . onBindViewHolder ( holder , position , payloads )
}
}
override fun onBindViewHolder ( holder : BookmarkNodeViewHolder , position : Int ) {
holder . bind ( tree [ position ] , mode )
}
}
/ * *
* A RecyclerView Adapter payload class that contains information about changes to a [ BookmarkNode ] .
*
* @property titleChanged true if there has been a change to [ BookmarkNode . title ] .
* @property urlChanged true if there has been a change to [ BookmarkNode . url ] .
* @property selectedChanged true if there has been a change in the BookmarkNode ' s selected state .
* @property modeChanged true if there has been a change in the state ' s mode type .
* /
data class BookmarkPayload (
val titleChanged : Boolean ,
val urlChanged : Boolean ,
val selectedChanged : Boolean ,
val modeChanged : Boolean
)
fun BookmarkNode . inRoots ( ) = enumValues < BookmarkRoot > ( ) . any { it . id == guid }