Я работаю с RecyclerView, чтобы добавить динамические заголовки. Я предоставил образец изображения, как показано ниже, что я хочу.
На изображении выше дети конечны, что не в моем случае. У меня неуверенные дети после заголовка.
В основном вместо header0 это будет название месяца, например MAR, а ниже будут происходить события, которые произошли в месяце MAR. Данные поступают из API, т.е. веб-службы, в которой также наступает дата, но я изо всех сил пытаюсь создать логику для того, что я объяснил выше.
То, что я пробовал, показано ниже. Ниже приведен пример проекта, который я создал, поскольку исходный код является конфиденциальным и имеет аналогичную логическую проблему, как и исходный.
MainActivity.java
public class MainActivity extends AppCompatActivity {
private RecyclerView rv;
private ArrayList<Bean> beanArrayList = new ArrayList<>();
private ArrayList<Bean> beanArrayListToPopulate = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addDataToBean();
rv = findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this));
String prevMonth = null;
for (int i = 0; i < beanArrayList.size(); i++) {
Bean bean = new Bean();
bean.setFirstName(beanArrayList.get(i).getFirstName());
String newMonth;
String createdDate = beanArrayList.get(i).getCreatedDate();
if (createdDate != null) {
newMonth = createdDate.split(" ")[1].trim();
if (!newMonth.equalsIgnoreCase(prevMonth)) {
bean.setViewType(Adapter.VIEW_TYPE_ITEM);
} else if (newMonth.equalsIgnoreCase(prevMonth)) {
bean.setViewType(Adapter.VIEW_TYPE_HEADER);
bean.setHeaderString(newMonth);
}
prevMonth = newMonth;
}
beanArrayListToPopulate.add(bean);
}
rv.setAdapter(new Adapter(beanArrayListToPopulate));
}
private void addDataToBean() {
SimpleDateFormat sdf = new SimpleDateFormat("dd MMM yyyy");
Date currentDate = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(currentDate);
for (int i = 0; i < 50; i++) {
Bean bean = new Bean();
calendar.add(Calendar.DATE, 10);
Date newDate = calendar.getTime();
bean.setCreatedDate(sdf.format(newDate));
bean.setFirstName("Maulik - " + i);
beanArrayList.add(bean);
}
}
}
Адаптер.java
public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int VIEW_TYPE_ITEM = 0;
public static final int VIEW_TYPE_HEADER = 1;
private ArrayList<Bean> mBeanList;
public Adapter(ArrayList<Bean> beanList) {
this.mBeanList = beanList;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == VIEW_TYPE_HEADER) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
return new VHHeader(view);
} else if (viewType == VIEW_TYPE_ITEM) {
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new VHItem(view);
}
throw new RuntimeException("There is no type that matches the type " + viewType + ". Make sure you are using view types correctly!");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof VHHeader) {
((VHHeader) holder).tvHeader.setText(mBeanList.get(position).getHeaderString());
} else if (holder instanceof VHItem) {
((VHItem) holder).tvItem.setText(mBeanList.get(position).getFirstName());
}
}
@Override
public int getItemCount() {
return mBeanList.size();
}
@Override
public int getItemViewType(int position) {
return mBeanList.get(position).getViewType();
}
class VHItem extends RecyclerView.ViewHolder {
private TextView tvItem;
public VHItem(View itemView) {
super(itemView);
tvItem = itemView.findViewById(R.id.tv_item);
}
}
class VHHeader extends RecyclerView.ViewHolder {
private TextView tvHeader;
public VHHeader(View itemView) {
super(itemView);
tvHeader = itemView.findViewById(R.id.tv_header);
}
}
}
Бин.java
public class Bean {
private String createdDate;
private String firstName;
private int viewType;
private String headerString;
public String getCreatedDate() {
return createdDate;
}
public void setCreatedDate(String createdDate) {
this.createdDate = createdDate;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getViewType() {
return viewType;
}
public void setViewType(int viewType) {
this.viewType = viewType;
}
public String getHeaderString() {
return headerString;
}
public void setHeaderString(String headerString) {
this.headerString = headerString;
}
}
Получение вывода в виде:
Заранее спасибо.!