Ich bin mit folgender Situation konfrontiert: Ich habe einen RecyclerView mit 3 verschiedenen Viewtypen. Jeder enthält einen Untertitel und dann entweder eine Radiogruppe, Checkboxen oder einen EditText. Das Problem ist: Die Anzahl der Elemente (Edittext, Checkbox, Radiobuttons) ist variabel, daher kann ich keine statische Vorlage als Viewtypes erstellen. Also versuche ich etwas zu erreichen (Beispiel mit Radiobuttons):RecyclerView - Listeneintrag mit unbekannter Anzahl von Elementen
LISTVIEW
------------------
row1
1) choice1
2) choice2
------------------
row2
1) choice1
2) choice2
3) choice3
------------------
row3
1) choice1
-------------------
Irgendwelche Ideen über einen guten Ansatz? Danke für deine Zeit und Hilfe! :)
EDIT: ChaitanyaAtkuris Antwort war sehr hilfreich, aber ich bekomme eine ClassCastException in der onBindViewHolder(). Es sagt "kann TitleHolder zu InputHolder nicht werfen" ... aber ich kann nicht herausfinden, warum das Halter-Objekt tatsächlich ein TitleHolder ist, weil es den richtigen Fall (INPUT) obwohl verwendet. Hier ist mein Adapter Code
public class RecAdapter extends RecyclerView.Adapter {
private List<Object> items;
private final int TITLE_VIEW = 0;
private final int RADIO_GROUP = 1;
private final int CHECK_BOX = 2;
private final int INPUT = 3;
public RecAdapter(List<Object> data) {
this.items = data;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
switch (viewType) {
case CHECK_BOX:
View v1 = inflater.inflate(R.layout.child_checkbox, parent, false);
viewHolder = new CheckboxHolder(v1);
break;
case TITLE_VIEW:
View v2 = inflater.inflate(R.layout.child_title, parent, false);
viewHolder = new TitleHolder(v2);
break;
case INPUT:
View v3 = inflater.inflate(R.layout.child_inputfield, parent, false);
viewHolder = new TitleHolder(v3);
break;
}
return viewHolder;
}
@Override
public int getItemViewType(int position) {
ListItem item = (ListItem) items.get(position);
if (item.getviewType()==TITLE_VIEW) {
return TITLE_VIEW;
} else if (item.getviewType()==RADIO_GROUP) {
return RADIO_GROUP;
} else if (item.getviewType()==CHECK_BOX) {
return CHECK_BOX;
} else if (item.getviewType()==INPUT) {
return INPUT;
}
return -1;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case CHECK_BOX:
CheckboxHolder checkboxHolder = (CheckboxHolder) holder;
configureCheckBoxHolder(checkboxHolder, position);
break;
case TITLE_VIEW:
TitleHolder titleHolder = (TitleHolder) holder;
configureTitleHolder(titleHolder, position);
break;
case INPUT:
InputHolder inputHolder = (InputHolder) holder;
configureInputHolder(inputHolder, position);
break;
}
}
private void configureCheckBoxHolder(CheckboxHolder holder,int position) {
CheckBoxElement boxElement = (CheckBoxElement) items.get(position);
if (boxElement != null) {
holder.box.setText(boxElement.getText());
}
}
private void configureInputHolder(InputHolder holder,int position) {
InputField field = (InputField) items.get(position);
if (field != null) {
holder.title.setText(field.getSubtitle());
}
}
private void configureTitleHolder(TitleHolder holder,int position) {
TitlePojo titlePojo = (TitlePojo) items.get(position);
if (titlePojo != null) {
holder.titleText.setText(titlePojo.getTitle());
}
}
@Override
public int getItemCount() {
return items.size();
}
private class InputHolder extends RecyclerView.ViewHolder {
private TextView title;
private EditText inputfield;
public InputHolder(View v1) {
super(v1);
title = (TextView) v1.findViewById(R.id.inputTitleItem);
inputfield = (EditText) v1.findViewById(R.id.fieldItem);
}
}
private class TitleHolder extends RecyclerView.ViewHolder {
private TextView titleText;
public TitleHolder(View v1) {
super(v1);
titleText = (TextView) v1.findViewById(R.id.titleView);
}
}
private class CheckboxHolder extends RecyclerView.ViewHolder {
private CheckBox box;
public CheckboxHolder(View v1) {
super(v1);
box = (CheckBox) v1.findViewById(R.id.checkboxItem);
}
}
private class RadioGroupHolder extends RecyclerView.ViewHolder {
private RadioGroup group;
public RadioGroupHolder(View v1) {
super(v1);
}
}
}
Was sind element1, element2, 3 hier? – ChaitanyaAtkuri
die Zeilen in der RecyclerView. Ich werde das ändern – Pynnie
Wie wäre es, wenn Sie nur eine Ansicht mit allen Textansichten, Kontrollkästchen und Optionsfeldern erstellen, die Sie brauchen, und setzen Sie ihre Sichtbarkeit auf gegangen. Sie können ihre Sichtbarkeit in Ihrem Halter sichtbar ändern, wenn sie benötigt werden. – paul590