Last active
February 8, 2016 21:41
-
-
Save williamwebb/c7b07ececd2aa5e0ad10 to your computer and use it in GitHub Desktop.
RecycleView adapter for use with Android's DataBinding plugin.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 { | |
// … | |
// } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage
DataBindingAdapter<Pojo, LayoutBinding> listAdapter = new DataBindingAdapter<>(pojo, R.layout.app_layout_row, BR.data);