How To Add Multiple Header Views In A Listview
Solution 1:
I don't think what you want to do is possible the way you are trying to do it. When you use addHeaderView
it wraps your ListAdapter
in HeaderViewListAdapter
. I looked at the docs for it here and that seems to imply that you could have multiple headers, but they would all be at the top (duh, header).
It sounds like what you actually want is seperators...
You could use CommonWare's MergeAdapter. It will let you insert adapters and views (in whatever order you wish) and present them all as a single adapter to a listview. You just hand it headers and adapters for each section of content and then set it to your list.
Pseudo-code example:
myMergeAdapter = newMergeAdapter();
myMergeAdapter.addView(HeaderView1);
myMergeAdapter.addAdapter(listAdapter1);
myMergeAdapter.addView(HeaderView2);
myMergeAdapter.addAdapter(listAdapter2);
setListAdapter(myMergeAdapter);
Solution 2:
I achieved multiple header scenario using custom Section Adapter
which is originally coded by CommonsWare, you can make section within listivew, like Books, Games and etc. check out below code.
Section Adapter:
package com.medplan.db;
import java.util.ArrayList;
import java.util.List;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
abstractpublicclassSectionedAdapterextendsBaseAdapter {
StringTAG="========SectionedAdapter============";
abstractprotected View getHeaderView(String caption,
int index,
View convertView,
ViewGroup parent);
private List<Section> sections=newArrayList<Section>();
privatestaticint TYPE_SECTION_HEADER=0;
publicSectionedAdapter() {
super();
sections.clear();
}
publicvoidaddSection(String caption, Adapter adapter) {
sections.add(newSection(caption, adapter));
}
publicvoidclear() {
sections.clear();
notifyDataSetChanged();
}
public Object getItem(int position) {
for (Section section : this.sections) {
if (position==0) {
return(section);
}
int size=section.adapter.getCount()+1;
if (position<size) {
return(section.adapter.getItem(position-1));
}
position-=size;
}
return(null);
}
publicintgetCount() {
int total=0;
for (Section section : this.sections) {
total+=section.adapter.getCount()+1; // add one for header
}
return(total);
}
publicintgetViewTypeCount() {
int total=1; // one for the header, plus those from sectionsfor (Section section : this.sections) {
total+=section.adapter.getViewTypeCount();
}
return(total);
}
publicintgetItemViewType(int position) {
int typeOffset=TYPE_SECTION_HEADER+1; // start counting from herefor (Section section : this.sections) {
if (position==0) {
return(TYPE_SECTION_HEADER);
}
int size=section.adapter.getCount()+1;
if (position<size) {
return(typeOffset+section.adapter.getItemViewType(position-1));
}
position-=size;
typeOffset+=section.adapter.getViewTypeCount();
}
return(-1);
}
publicbooleanareAllItemsSelectable() {
return(false);
}
publicbooleanisEnabled(int position) {
return(getItemViewType(position)!=TYPE_SECTION_HEADER);
}
public View getView(int position, View convertView,
ViewGroup parent) {
int sectionIndex=0;
for (Section section : this.sections) {
if (position==0) {
return(getHeaderView(section.caption, sectionIndex,
convertView, parent));
}
int size=section.adapter.getCount()+1;
if (position<size) {
return(section.adapter.getView(position-1,convertView,parent));
}
position-=size;
sectionIndex++;
}
return(null);
}
publiclonggetItemId(int position) {
return(position);
}
classSection {
Stringcaption=null;
Adapteradapter=null;
Section(String caption, Adapter adapter) {
this.caption=caption;
this.adapter=adapter;
}
}
}
Within Activity make Section adapter object,check out below code:
finalSectionedAdapteradapter=newSectionedAdapter()
{
protected View getHeaderView(String caption, int index, View convertView,ViewGroup parent)
{
result=(TextView)convertView;
if (convertView==null)
{
result=(TextView)getLayoutInflater().inflate(R.layout.section_header,null);
}
result.setText(caption);
// temp=caption;// ind=index;return(result);
}
};
section_header.xml
<?xml version="1.0" encoding="utf-8"?><TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@color/black"android:textColor="#FFFFFF"android:ellipsize="end"android:textSize="11sp"style="?android:attr/listSeparatorTextViewStyle" /><!-- android:background="#515050"-->
Within Activity add section as many as you want like below:
Note: userPic & medPic are name of arraylist.
adapter.addSection("section first", newEfficientAdapter(getApplicationContext(),usersPic));
adapter.addSection("section second", newEfficientAdapter(getApplicationContext(),medPic));
listview.setAdapter(adapter);
Solution 3:
I would solve this issue with ExpandableListView. It doesn't require any extra library.
- Create your custom adapter.
- Give your data and fill the methods you need to override.
- After setting the adapter with ExpandableListView:
- Override groupItemClick so clicking on the groups won't actually expand the view.
- Loop through every parent in adapter and set them expanded.
Post a Comment for "How To Add Multiple Header Views In A Listview"