Skip to content

Instantly share code, notes, and snippets.

@azlekov
Last active January 3, 2020 18:01
Show Gist options
  • Save azlekov/c6e355d44b1b0611a7f5b787ee416382 to your computer and use it in GitHub Desktop.
Save azlekov/c6e355d44b1b0611a7f5b787ee416382 to your computer and use it in GitHub Desktop.
Parse Server RecyclerView Adapter with Data binding support
fun <T : ParseObject, VH : ViewDataBinding> RecyclerView.bind(
query: ParseQuery<T>,
@LayoutRes layout: Int = 0,
lifecycleOwner: LifecycleOwner
): ParseRecyclerAdapter<T, VH> {
val parseAdapter = ParseRecyclerAdapter<T, VH>(query, layout, lifecycleOwner)
layoutManager = LinearLayoutManager(context)
adapter = parseAdapter
return parseAdapter
}
class ParseRecyclerAdapter<T : ParseObject, VH : ViewDataBinding>(
private var query: ParseQuery<T>,
private var layout: Int,
lifecycleOwner: LifecycleOwner
) :
RecyclerView.Adapter<ParseRecyclerAdapter<T, VH>.ViewHolder>(), LifecycleObserver {
init {
lifecycleOwner.lifecycle.addObserver(this)
}
private var objects: MutableList<T> = mutableListOf()
private var eachFunc: View.(binding: VH) -> Unit = {}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun start() {
query.findInBackground { objects, e ->
if (e != null) {
return@findInBackground
}
this.objects.clear()
this.objects.addAll(objects)
notifyDataSetChanged()
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun stop() {
if (query.isRunning) {
query.cancel()
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = DataBindingUtil.inflate<VH>(
LayoutInflater.from(parent.context), layout, parent, false
)
return ViewHolder(binding)
}
override fun getItemCount(): Int {
return objects.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item: T = objects[position]
holder.bind(item.objectId, item, eachFunc)
}
inner class ViewHolder(private val binding: VH) :
RecyclerView.ViewHolder(binding.root) {
fun bind(id: String, entry: T, click: View.(binding: VH) -> Unit) {
binding.setVariable(BR.item, entry)
binding.root.apply {
tag = id
click(binding)
}
}
}
fun forEach(lambda: View.(binding: VH) -> Unit) {
eachFunc = lambda
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment