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:
Los datos de Adapter son genéricos y se extienden desde la clase
Wrapper
. La claseWrapper
simplemente clase POJO contiene dos camposviewType
y datos deitem
. ElviewType
pasará a través degetItemViewType(int position)
y elitem
es datos para cada titular de la vista.El
ViewHolder
genérico conT
es un tipo de datos para el titular de la vista. Puede ver dos titulares de vistas personalizadasUserViewHolder
yBottomViewHolder
extiende desdeViewHolder
con estos datos. (Por lo tanto, en elonBind
de cada vista, el titular tendrá datos exactos que quiera usar -> no es necesario lanzar. Porque ya estamos en el reparto).El
ViewType
enum contiene todo el tipo de vista de adaptador. Además, en el tipo de vista, tenemos el métodoViewHolder onCreateViewHolder(ViewGroup parent)
para que podamos hacer viewHolder deViewType
. 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).