Sie können mit mehreren Ansichtstypen RecyclerAdapter
umgehen, indem Sie getItemViewType()
den erwarteten viewType
-Wert für diese Position zurückgeben lassen.
Ich habe einen MultipleViewTypeAdapter
vorbereitet, um eine MCQ-Liste für Prüfungen zu erstellen, bei der eine Frage gestellt werden kann, die zwei oder mehr gültige Antworten (Checkbox-Optionen) und eine Frage mit einer einzelnen Antwort (Radiobutton-Optionen) haben kann.
Dafür erhalte ich den Fragetyp aus der API-Antwort und verwende ihn, um zu entscheiden, welche Ansicht ich für diese Frage anzeigen muss.
public class MultiViewTypeAdapter extends RecyclerView.Adapter {
Context mContext;
ArrayList dataSet;
ArrayList questions;
private Object radiobuttontype1;
//Viewholder, um Fragen mit Kontrollkästchen anzuzeigen
public static class Checkboxtype2 extends RecyclerView.ViewHolder {
ImageView imgclockcheck;
CheckBox checkbox;
public Checkboxtype2(@NonNull View itemView) {
super(itemView);
imgclockcheck = (ImageView) itemView.findViewById(R.id.clockout_cbox_image);
checkbox = (CheckBox) itemView.findViewById(R.id.clockout_cbox);
}
}
//Viewholder, um Fragen mit Radiobuttons anzuzeigen
public static class Radiobuttontype1 extends RecyclerView.ViewHolder {
ImageView clockout_imageradiobutton;
RadioButton clockout_radiobutton;
TextView sample;
public radiobuttontype1(View itemView) {
super(itemView);
clockout_imageradiobutton = (ImageView) itemView.findViewById(R.id.clockout_imageradiobutton);
clockout_radiobutton = (RadioButton) itemView.findViewById(R.id.clockout_radiobutton);
sample = (TextView) itemView.findViewById(R.id.sample);
}
}
public MultiViewTypeAdapter(ArrayList data, Context context) {
this.dataSet = data;
this.mContext = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
if (viewType.equalsIgnoreCase("1")) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clockout_radio_list_row, viewGroup, false);
return new radiobuttontype1(view);
} else if (viewType.equalsIgnoreCase("2")) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clockout_cbox_list_row, viewGroup, false);
view.setHorizontalFadingEdgeEnabled(true);
return new Checkboxtype2(view);
} else if (viewType.equalsIgnoreCase("3")) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clockout_radio_list_row, viewGroup, false);
return new Radiobuttontype1(view);
} else if (viewType.equalsIgnoreCase("4")) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clockout_radio_list_row, viewGroup, false);
return new Radiobuttontype1(view);
} else if (viewType.equalsIgnoreCase("5")) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clockout_radio_list_row, viewGroup, false);
return new Radiobuttontype1(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int viewType) {
if (viewType.equalsIgnoreCase("1")) {
options = dataSet.get(i).getOptions();
question = dataSet.get(i).getQuestion();
image = options.get(i).getValue();
((radiobuttontype1) viewHolder).clockout_radiobutton.setChecked(false);
((radiobuttontype1) viewHolder).sample.setText(question);
//Das Bild im ViewHolder-View laden
Picasso.with(mContext)
.load(image)
.into(((radiobuttontype1) viewHolder).clockout_imageradiobutton);
} else if (viewType.equalsIgnoreCase("2")) {
options = (ArrayList) dataSet.get(i).getOptions();
question = dataSet.get(i).getQuestion();
image = options.get(i).getValue();
//Das Bild im ViewHolder-View laden
Picasso.with(mContext)
.load(image)
.into(((Checkboxtype2) viewHolder).imgclockcheck);
} else if (viewType.equalsIgnoreCase("3")) {
//Daten für ViewHolder für Ansichtstyp 3 anpassen
} else if (viewType.equalsIgnoreCase("4")) {
//Daten für ViewHolder für Ansichtstyp 4 anpassen
} else if (viewType.equalsIgnoreCase("5")) {
//Daten für ViewHolder für Ansichtstyp 5 anpassen
}
}
@Override
public int getItemCount() {
return dataSet.size();
}
/**
* Gibt den Ansichtstyp für diese Position zurück, indem der Ansichtstypwert aus dem
* Datensatz ausgewählt wird
*/
@Override
public int getItemViewType(int position) {
return dataSet.get(position).getViewType();
}
}
Sie können mehrfache bedingte Anweisungen basierend auf der viewHolder-Datenfüllung in onBindViewHolder()
vermeiden, indem Sie ähnlichen Ansichten über ViewHolders, die sich in ihrer Positionierung unterscheiden, dieselben IDs zuweisen.