Wenn die Layouts für Ansichtstypen nur wenige sind und die Bindungslogik einfach ist, folgen Sie Antons Lösung. Aber der Code wird unübersichtlich, wenn Sie komplexe Layouts und Bindungslogik verwalten müssen.
Ich glaube, die folgende Lösung wird für jemanden nützlich sein, der komplexe Ansichtstypen behandeln muss.
Basisklasse DataBinder
abstract public class DataBinder {
private DataBindAdapter mDataBindAdapter;
public DataBinder(DataBindAdapter dataBindAdapter) {
mDataBindAdapter = dataBindAdapter;
}
abstract public T newViewHolder(ViewGroup parent);
abstract public void bindViewHolder(T holder, int position);
abstract public int getItemCount();
......
}
Die Funktionen, die in dieser Klasse definiert werden müssen, sind ziemlich ähnlich wie die Adapterklasse beim Erstellen des einzelnen Ansichtstyps.
Erstellen Sie für jeden Ansichtstyp die Klasse, indem Sie diesen DataBinder erweitern.
Beispiel DataBinder-Klasse
public class Sample1Binder extends DataBinder {
private List mDataSet = new ArrayList();
public Sample1Binder(DataBindAdapter dataBindAdapter) {
super(dataBindAdapter);
}
@Override
public ViewHolder newViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.layout_sample1, parent, false);
return new ViewHolder(view);
}
@Override
public void bindViewHolder(ViewHolder holder, int position) {
String title = mDataSet.get(position);
holder.mTitleText.setText(title);
}
@Override
public int getItemCount() {
return mDataSet.size();
}
public void setDataSet(List dataSet) {
mDataSet.addAll(dataSet);
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView mTitleText;
public ViewHolder(View view) {
super(view);
mTitleText = (TextView) view.findViewById(R.id.title_type1);
}
}
}
Um DataBinder-Klassen zu verwalten, erstellen Sie eine Adapterklasse.
Basisklasse DataBindAdapter
abstract public class DataBindAdapter extends RecyclerView.Adapter {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return getDataBinder(viewType).newViewHolder(parent);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
int binderPosition = getBinderPosition(position);
getDataBinder(viewHolder.getItemViewType()).bindViewHolder(viewHolder, binderPosition);
}
@Override
public abstract int getItemCount();
@Override
public abstract int getItemViewType(int position);
public abstract T getDataBinder(int viewType);
public abstract int getPosition(DataBinder binder, int binderPosition);
public abstract int getBinderPosition(int position);
......
}
Erstellen Sie die Klasse, indem Sie diese Basisklasse erweitern, und instanziieren Sie dann DataBinder-Klassen und überschreiben Sie abstrakte Methoden
-
getItemCount
Geben Sie die Gesamtanzahl der DataBinder-Elemente zurück
-
getItemViewType
Definieren Sie die Zuordnungslogik zwischen der Adapterposition und dem Ansichtstyp.
-
getDataBinder
Geben Sie die DataBinder-Instanz basierend auf dem Ansichtstyp zurück
-
getPosition
Definieren Sie die Konvertierungslogik zur Adapterposition aus der Position im spezifischen DataBinder
-
getBinderPosition
Definieren Sie die Konvertierungslogik zur Position im DataBinder aus der Adapterposition
Ich habe eine ausführlichere Lösung und Beispiele auf GitHub hinterlassen, also schauen Sie bitte bei RecyclerView-MultipleViewTypeAdapter vorbei, wenn Sie sie benötigen.