make - android: adaptador genérico recyclerview con enlace de datos
recyclerview android studio (1)
Lo que quería: Necesitaba que el Modelo pasara a Diseño, obviamente necesitábamos usar sus propiedades para enlazar. Es por eso que pensé en hacer de BaseViewHolder una clase genérica.
Problema real: no puede obtener Clase de clase genérica. Significa que no puedo inicializar BaseRecyclerAdapter de la siguiente manera:
private BaseRecyclerAdapter1<Model, EmptyViewHolder, ModelViewHolder> baseRecyclerAdapter1 = new BaseRecyclerAdapter1<>(R.layout.layout_empty, EmptyViewHolder<Model>.class, R.layout.list_item, ModelViewHolder<Model>.class);
Solución: gracias al enlace de datos. <variable />
etiqueta <variable />
hace el tipo de conversión para usted.
public class BaseViewHolder extends RecyclerView.ViewHolder {
private final ViewDataBinding binding;
public BaseViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(Object object) {
binding.setVariable(BR.obj, object);
binding.executePendingBindings();
}
}
Entonces, ahora puedo inicializar BaseRecyclerAdapter como:
private BaseRecyclerAdapter1<Model, EmptyViewHolder, ModelViewHolder> baseRecyclerAdapter1 = new BaseRecyclerAdapter1<>(R.layout.layout_empty, EmptyViewHolder.class, R.layout.list_item, ModelViewHolder.class);
En diseño:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="android.view.View" />
<variable
name="obj"
type="com.xxx.Model" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
</layout>
Happy Coding .. !!
Intenté crear un adaptador Recyclerview genérico como el siguiente:
BaseRecyclerAdapter:
public class BaseRecyclerAdapter<T, MVH extends BaseViewHolder<T>, EVH extends BaseViewHolder<T>> extends RecyclerView.Adapter<BaseViewHolder<T>> {
private static final int VIEW_TYPE_EMPTY = 0;
private static final int VIEW_TYPE_DATA = 1;
private List<T> list = new ArrayList<>();
@LayoutRes
private int emptyViewLayoutResource;
private Class<EVH> emptyViewHolder;
@LayoutRes
private int dataLayoutResource;
private Class<MVH> dataViewHolder;
public BaseRecyclerAdapter(int emptyViewLayoutResource, Class<EVH> emptyViewHolder, int dataLayoutResource, Class<MVH> dataViewHolder) {
this.emptyViewLayoutResource = emptyViewLayoutResource;
this.emptyViewHolder = emptyViewHolder;
this.dataLayoutResource = dataLayoutResource;
this.dataViewHolder = dataViewHolder;
}
@Override
public BaseViewHolder<T> onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, viewType == VIEW_TYPE_EMPTY ? emptyViewLayoutResource : dataLayoutResource, parent, false);
try {
return viewType == VIEW_TYPE_EMPTY ? emptyViewHolder.getConstructor(ViewDataBinding.class).newInstance(binding) : dataViewHolder.getConstructor(View.class).newInstance(binding);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (InstantiationException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
@Override
public void onBindViewHolder(BaseViewHolder<T> holder, int position) {
int viewType = getItemViewType(position);
if (viewType == VIEW_TYPE_EMPTY) {
} else {
holder.bind(list.get(position));
}
}
@Override
public int getItemCount() {
return list.size() == 0 ? 1 : list.size();
}
@Override
public int getItemViewType(int position) {
return list.size() == 0 ? VIEW_TYPE_EMPTY : VIEW_TYPE_DATA;
}
}
BaseViewHolder:
public class BaseViewHolder<T> extends RecyclerView.ViewHolder {
private final ViewDataBinding binding;
public BaseViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(T t) {
binding.setVariable(BR.obj, t);
binding.executePendingBindings();
}
}
¿Alguien puede intentarlo y sugerirme cómo inicializar esta clase para usarla con RecyclerView?