studio recyclerview make how create card and android android-recyclerview recycler-adapter

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?