Adding multiple header in Recyclerview or Listview. randomly

冷暖自知 提交于 2019-12-12 07:56:50

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!