Here is a generic ViewHolder class that you can use with any DataBinding layout. Here an instance of particular [ViewDataBinding](<https://developer.android.com/reference/android/databinding/ViewDataBinding.html>)
class is created using the inflated View
object and [DataBindingUtil](<https://developer.android.com/reference/android/databinding/DataBindingUtil.html>)
utility class.
import android.databinding.DataBindingUtil;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class BindingViewHolder<T> extends RecyclerView.ViewHolder{
private final T binding;
public BindingViewHolder(View itemView) {
super(itemView);
binding = (T)DataBindingUtil.bind(itemView);
}
public T getBinding() {
return binding;
}
}
After creating this class you can use the <layout>
in your layout file to enable databinding for that layout like this:
file name: my_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="<http://schemas.android.com/apk/res/android>">
<data>
<variable
name="item"
type="ItemModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@{item.itemLabel}" />
</LinearLayout>
</layout>
and here is your sample dataModel:
public class ItemModel {
public String itemLabel;
}
By default, Android Data Binding library generates a ViewDataBinding
class based on the layout file name, converting it to Pascal case and suffixing “Binding” to it. For this example it would be MyItemBinding
for the layout file my_item.xml
. That Binding class would also have a setter method to set the object defined as data in the layout file(ItemModel
for this example).
Now that we have all the pieces we can implement our adapter like this:
class MyAdapter extends RecyclerView.Adapter<BindingViewHolder<MyItemBinding>>{
ArrayList<ItemModel> items = new ArrayList<>();
public MyAdapter(ArrayList<ItemModel> items) {
this.items = items;
}
@Override public BindingViewHolder<MyItemBinding> onCreateViewHolder(ViewGroup parent, int viewType) {
return new BindingViewHolder<>(LayoutInflater.from(parent.getContext()).inflate(R.layout.my_item, parent, false));
}
@Override public void onBindViewHolder(BindingViewHolder<ItemModel> holder, int position) {
holder.getBinding().setItemModel(items.get(position));
holder.getBinding().executePendingBindings();
}
@Override public int getItemCount() {
return items.size();
}
}