Skip to content

Instantly share code, notes, and snippets.

View tonnylitao's full-sized avatar
🎯
Focusing

Tonny tonnylitao

🎯
Focusing
View GitHub Profile
data class Comment(
...
) : RecyclerItem {
...
}
data class ComplexModel(
val model: SomeModel
...
) : RecyclerItem {
class MainFragment:
Fragment(R.layout.fragment_main) {
private val adapter by lazy {
RecyclerAdapter(
RecyclerItem.diffCallback<User>(),
R.layout.list_item_user_placeholder
) { _, _, item ->
data class User(
...
) : RecyclerItem {
override val layoutId: Int
get() = R.layout.list_item_user
override val variableId: Int
get() = BR.user
override val dataToBind: Any
override fun onBindViewHolder(
holder: ViewHolder,
position: Int
){
getItem(position)?.run(holder.binding::bind)
}
} //end of RecyclerAdapter
private fun ViewDataBinding.bind(
inner class ViewHolder(
val binding: ViewDataBinding
): RecyclerView.ViewHolder(binding.root)
override fun getItemViewType(position: Int)
= requireNotNull(
getItem(position)?.layoutId ?: placeholderId
){
"item at $position is null"
}
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int)
class RecyclerAdapter<M : RecyclerItem>(
diffCallback: DiffUtil.ItemCallback<M>,
@LayoutRes val placeholderId: Int?,
private val clickListener: Listener? = null
) : PagedListAdapter<M, ViewHolder<M>>
(diffCallback) {
import androidx.recyclerview.widget.DiffUtil
interface RecyclerItem {
val layoutId: Int
val variableId: Int
val dataToBind: Any
val id: Int
@tonnylitao
tonnylitao / Factory.kt
Created April 30, 2020 22:16
Copy paste demo
class IntViewModelFactory(val application: Application, val int: Int) :
ViewModelProvider.NewInstanceFactory() {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(modelClass: Class<T>) =
IntViewModel(application, int) as T
}
class StringViewModelFactory(val application: Application, val string: String) :
ViewModelProvider.NewInstanceFactory() {
@tonnylitao
tonnylitao / AndroidViewModelFactory.kt
Last active December 12, 2020 16:48
Android ViewModel with Variable Arguments
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import kotlin.reflect.full.primaryConstructor
class AndroidViewModelFactory(private vararg val args: Any) :
ViewModelProvider.NewInstanceFactory() {
override fun <T : ViewModel> create(modelClass: Class<T>) =
modelClass.kotlin.primaryConstructor?.call(*args)
?: throw IllegalArgumentException("$modelClass primaryConstructor is null")