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

make - recyclerview android studio



¿Cómo implementar tipos de vistas múltiples para RecycleView? (1)

ACTUALIZAR

Recomiendo leer este artículo: Escribir un mejor adaptador

Esta es la forma en que personalicé los tipos de vistas múltiples para RecyclewView.

Primero mostraré el código, luego explicaré abajo.

@SuppressWarnings("unchecked") public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> { private final List<Wrapper<?>> items; public BaseAdapter() { this.items = new ArrayList<>(); } @Override public int getItemViewType(int position) { return items.get(position).viewType; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return ViewType.values()[viewType].onCreateViewHolder(parent); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.onBind(items.get(position)); } @Override public int getItemCount() { return items.size(); } public void simulateAddItems() { items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); items.add(new Wrapper<>(ViewType.BOTTOM.viewTYpe(), new BottomData())); notifyDataSetChanged(); } public enum ViewType { USER { @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { return new UserViewHolder(itemView); } }, BOTTOM { @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { return new BottomViewHolder(itemView); } }; public abstract ViewHolder onCreateViewHolder(ViewGroup parent); public int viewTYpe() { return ordinal(); } } static class Wrapper<T> { final int viewType; final T data; public Wrapper(int viewType, T data) { this.viewType = viewType; this.data = data; } } public static class ViewHolder<T> extends RecyclerView.ViewHolder { private T item; public ViewHolder(View itemView) { super(itemView); } public void onBind(T item) { } } public static class UserViewHolder extends ViewHolder<User> { public UserViewHolder(View itemView) { super(itemView); } @Override public void onBind(User item) { super.onBind(item); } } public static class BottomViewHolder extends ViewHolder<BottomData> { public BottomViewHolder(View itemView) { super(itemView); } @Override public void onBind(BottomData item) { super.onBind(item); } } static class User { // user fields & method } static class BottomData { // bottom data fields & method } }

Puedes ver que el adaptador tiene algo especial:

  1. Los datos de Adapter son genéricos y se extienden desde la clase Wrapper . La clase Wrapper simplemente clase POJO contiene dos campos viewType y datos de item . El viewType pasará a través de getItemViewType(int position) y el item es datos para cada titular de la vista.

  2. El ViewHolder genérico con T es un tipo de datos para el titular de la vista. Puede ver dos titulares de vistas personalizadas UserViewHolder y BottomViewHolder extiende desde ViewHolder con estos datos. (Por lo tanto, en el onBind de cada vista, el titular tendrá datos exactos que quiera usar -> no es necesario lanzar. Porque ya estamos en el reparto).

  3. El ViewType enum contiene todo el tipo de vista de adaptador. Además, en el tipo de vista, tenemos el método ViewHolder onCreateViewHolder(ViewGroup parent) para que podamos hacer viewHolder de ViewType . Creo que es más fácil para nuestros ojos ver al Titular relativo al ViewType.

Además, tenemos el método viewType() simplemente devuelve ordinal() de enum. Como referencia en java docs que el método puede no utilizar. Pero en este caso, creo que es justo usar (porque es único).

Entonces, en el método onCreateViewHolder of Adapter podemos hacer una llamada simple: return ViewType.values()[viewType].onCreateViewHolder(parent);

y en onBindViewHolder llamaremos a holder.onBind(items.get(position)); .

Finalmente, hice simulateAddItems para la demostración de cómo agregamos el artículo al adaptador.

Aquí hay algunas experiencias al trabajar con el tipo de vista personalizada para RecycleView. Espero que sea útil y ayude a otras personas.

Actualmente, trabajo en tipos de vista múltiple personalizados para RecycleView. Encontré muchas soluciones para este problema, pero compartiré mi camino.

Lo diferente es use enum para definir ViewType.

Ver mi respuesta para más detalles. (Solo quiero compartir).