Я предлагаю вам Свести модель . Вместо того чтобы иметь родителя с ребенком, имейте только один уровень. Кроме того, использует различные модели данных для вашего пользовательского интерфейса и для модернизации . При необходимости, конвертировать между моделями. Таким образом, вещи не будут тесно связаны, и вы можете делать другие вещи при покрытии, например, форматировать строки при необходимости.
// This is what the data model will extend
interface UiBaseModel { }
// monthly detail report
class UiMonthlyDetailReport implements UiBaseModel {
private String month;
private String total;
UiMonthlyDetailReport(String month, String total) {
this.month = month;
this.total = total;
}
public String getMonth() {
return month;
}
public String getTotal() {
return total;
}
}
// monthly detail record
class UiMonthlyDetailsRecord implements UiBaseModel {
private String month;
private String expenseName;
private String expenseIcon;
private String expenseTotal;
UiMonthlyDetailsRecord(String month, String expenseName, String expenseIcon, String expenseTotal) {
this.month = month;
this.expenseName = expenseName;
this.expenseIcon = expenseIcon;
this.expenseTotal = expenseTotal;
}
public String getMonth() {
return month;
}
public String getExpenseName() {
return expenseName;
}
public String getExpenseIcon() {
return expenseIcon;
}
public String getExpenseTotal() {
return expenseTotal;
}
}
// In your activity / fragment / viewmodel / presenter:
List<ReportMonthlyDetailsReport> reports = ... // get your data from retrofit
List<UiBaseModel> uiModels = ArrayList<UiBaseModel>();
for (ReportMonthlyDetailsReport report : reports) {
// First records, then report
List<ReportMonthlyDetailsRecord> records = report.getRecords();
for (ReportMonthlyDetailsRecord record : records) {
// Create UI model and add to list
UiMonthlyDetailsRecord uiRecord = UiMonthlyDetailsRecord(record.getMonth_label(), record.getExpense_type_name(), record.getExpense_type_icon(), record.getExpense_type_total());
uiModels.add(uiRecord);
}
// Lastly, add the report
UiMonthlyDetailsReport uiReport = UiMonthlyDetailsReport(report.getMonth_label(), report.getMonthly_total());
uiModels.add(uiReport);
}
// Use the ui models (for the recycler adapter)
MonthlyDetailsAdapter adapter = MonthlyDetailsAdapter(uiModels);
recyclerView.adapter = adapter;
Все, что осталось сделать, это адаптер. Существует множество примеров поддержки нескольких типов представлений, простой незавершенный пример:
public class MonthlyDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final static int VIEW_TYPE_RECORD = 0;
private final static int VIEW_TYPE_REPORT = 1;
private List<UiBaseModel> data;
MonthlyDetailsAdapter(List<UiBaseModel> data) {
this.data = data;
}
class RecordViewHolder extends RecyclerView.ViewHolder {
public RecordViewHolder(@NonNull View itemView) {
// code
super(itemView);
}
}
class ReportViewHolder extends RecyclerView.ViewHolder {
public ReportViewHolder(@NonNull View itemView) {
// code
super(itemView);
}
}
@Override
public int getItemViewType(int position) {
UiBaseModel item = data.get(position);
if (item instanceof UiMonthlyDetailsRecord) {
return VIEW_TYPE_RECORD;
} else {
return VIEW_TYPE_REPORT;
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof RecordViewHolder) {
UiMonthlyDetailsRecord record = (UiMonthlyDetailsRecord) data.get(position);
// bind record
} else if (holder instanceof ReportViewHolder) {
UiMonthlyDetailsReport report = (UiMonthlyDetailsReport) data.get(position);
// bind report
}
}
}