Skip to content

Instantly share code, notes, and snippets.

@williamwebb
Last active February 8, 2016 21:41
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save williamwebb/c7b07ececd2aa5e0ad10 to your computer and use it in GitHub Desktop.
Save williamwebb/c7b07ececd2aa5e0ad10 to your computer and use it in GitHub Desktop.
RecycleView adapter for use with Android's DataBinding plugin.
package io.jug6ernaut.fln2.views;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.AnyRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* Created by williamwebb on 11/15/15.
* <p>
* RecycleView Adapter class for use with DataBinding.
*/
public class DataBindingAdapter<DataModel, ViewBinder extends ViewDataBinding> extends RecyclerView.Adapter<DataBindingAdapter.DataBindingViewHolder<DataModel, ViewBinder>> {
private OnViewBindCallback<ViewBinder> onViewBindCallback;
private final List<DataModel> data = new ArrayList<>();
private final int layoutId;
private final int variableId;
/**
* Constructor.
*
* @param data data to populate the Adapter with
* @param layoutId layout used by the adapter
* @param variableId variable id used to set DataBinding. Ex: BR.data
*/
public DataBindingAdapter(@NonNull List<DataModel> data, @LayoutRes int layoutId, @AnyRes int variableId) {
this.data.addAll(data);
this.layoutId = layoutId;
this.variableId = variableId;
}
/**
* Constructor.
*
* @param layoutId layout used by the adapter
* @param variableId variable id used to set DataBinding. Ex: BR.data
*/
public DataBindingAdapter(@LayoutRes int layoutId, @AnyRes int variableId) {
this(Collections.emptyList(),layoutId,variableId);
}
@Override
public DataBindingViewHolder<DataModel, ViewBinder> onCreateViewHolder(ViewGroup parent, int viewType) {
return DataBindingViewHolder.from(parent, layoutId, variableId);
}
public void setData(List<DataModel> data) {
this.data.clear();
this.data.addAll(data);
}
@Override
public void onBindViewHolder(DataBindingViewHolder<DataModel, ViewBinder> holder, int position) {
holder.bind(data.get(position));
if (onViewBindCallback != null) onViewBindCallback.onViewBind(holder.dataBinding);
}
@Override
public int getItemCount() {
return data.size();
}
/**
* Callback used to customize onBind
*
* @param callback
*/
public DataBindingAdapter setOnBindViewCallback(OnViewBindCallback<ViewBinder> callback) {
this.onViewBindCallback = callback;
return this;
}
public interface OnViewBindCallback<BinderType extends ViewDataBinding> {
void onViewBind(BinderType type);
}
static class DataBindingViewHolder<DataModel, ViewBinder extends ViewDataBinding> extends ViewHolder {
private final ViewBinder dataBinding;
private final int variableId;
static <DataModel, ViewBinder extends ViewDataBinding> DataBindingViewHolder<DataModel, ViewBinder> from(ViewGroup parent, int layoutId, int variableId) {
View v = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
return new DataBindingViewHolder<>(v, variableId);
}
DataBindingViewHolder(View itemView, int variableId) {
super(itemView);
this.variableId = variableId;
dataBinding = DataBindingUtil.bind(itemView);
}
void bind(DataModel data) {
dataBinding.setVariable(variableId, data);
dataBinding.executePendingBindings();
}
}
// Lint test to verify variableId is a variableId, possibly that it exist in layoutId
// public class EnumDetector extends Detector implements JavaScanner {
// …
// }
}
@williamwebb
Copy link
Author

Usage

DataBindingAdapter<Pojo, LayoutBinding> listAdapter = new DataBindingAdapter<>(pojo, R.layout.app_layout_row, BR.data);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment