问题
How can a add multiple header or dividers in RecyclerView or listview. randomly as highlighted in the image below:
Multiple heading in RecyclerView on the basic of date - Demo Image
回答1:
You can achieve it using the library SectionedRecyclerViewAdapter. It has the concept of "Sections" and each section can have its own header.
It looks to me that you need to group your calls by "date". So you can create your Section class like this:
class MySection extends StatelessSection {
String date;
List<Call> callList;
public MySection(String date, List<Call> callList) {
// call constructor with layout resources for this Section header, footer and items
super(R.layout.section_header, R.layout.section_footer, R.layout.section_item);
this.date = date;
this.callList = callList;
}
@Override
public int getContentItemsTotal() {
return callList.size(); // number of items of this section
}
@Override
public RecyclerView.ViewHolder getItemViewHolder(View view) {
// return a custom instance of ViewHolder for the items of this section
return new MyItemViewHolder(view);
}
@Override
public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
MyItemViewHolder itemHolder = (MyItemViewHolder) holder;
// bind your view here
itemHolder.tvItem.setText(callList.get(position).getContactName());
}
@Override
public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
return new SimpleHeaderViewHolder(view);
}
@Override
public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;
// bind your header view here
headerHolder.tvItem.setText(date);
}
}
Then you set up the RecyclerView with your Sections:
// Create an instance of SectionedRecyclerViewAdapter
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();
MySection mySection1 = new MySection("27 Mar, 2016", callList1);
MySection mySection2 = new MySection("28 Mar, 2016", callList2);
// Add your Sections
sectionAdapter.addSection(mySection1);
sectionAdapter.addSection(mySection2);
// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);
回答2:
Make a list in your constructor of Items:
private ArrayList<Item> list;
...
public AdapterMain() {
list.add(new HeaderItem());
list.add(new NormalItem());
list.add(new HeaderItem());
list.add(new NormalItem());
}
public Item getItem(int position) {
return list.get(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
if (viewType == Item.TYPE_NORMAL) {
View v = inflater.inflate(R.layout.adapter_normal, viewGroup, false);
return new NormalViewHolder(v);
} else if (viewType == Item.TYPE_HEADER) {
View v = inflater.inflate(R.layout.adapter_header, viewGroup, false);
return new HeaderViewHolder(v);
}
return null;
}
@Override
public int getItemViewType(int position) {
return list.get(position).getItemType();
}
@Override
public int getItemCount() {
return list.size();
}
public abstract class Item {
public static final int TYPE_HEADER = 0;
public static final int TYPE_NORMAL = 1;
public abstract void bindToViewHolder(RecyclerView.ViewHolder holder);
public abstract int getItemType();
}
The actual Header item: (Make also a NormalItem class and a NormalViewHolder class)
public class HeaderItem extends Item {
public HeaderItem() {
super();
}
@Override
public void bindToViewHolder(RecyclerView.ViewHolder viewholder) {
HeaderItem holder = (HeaderItem) viewholder;
holder.title.setText("Header");
}
@Override
public int getItemType() {
return Item.TYPE_HEADER;
}
}
public class HeaderViewHolder extends RecyclerView.ViewHolder {
TextView title;
public HeaderViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.textview);
}
}
来源:https://stackoverflow.com/questions/36277735/adding-multiple-header-in-recyclerview-or-listview-randomly