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 claseWrappersimplemente clase POJO contiene dos camposviewTypey datos deitem. ElviewTypepasará a través degetItemViewType(int position)y elitemes datos para cada titular de la vista.El
ViewHoldergenérico conTes un tipo de datos para el titular de la vista. Puede ver dos titulares de vistas personalizadasUserViewHolderyBottomViewHolderextiende desdeViewHoldercon estos datos. (Por lo tanto, en elonBindde cada vista, el titular tendrá datos exactos que quiera usar -> no es necesario lanzar. Porque ya estamos en el reparto).El
ViewTypeenum 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).