How do I add a footer View to a child List in a ExpandableListActivity?
I've been attempting to work out how to add a child View
to a child List
in an ExpandableListActivity
, but to no avail.
I can get the ExpandableListView
and call addFooterView()
on it, but that just adds the new View
to the group list. (The data comes from a Cursor
).
Any suggestions gratefully received.
Cheers
开发者_StackOverflow中文版James
Unfortunately there is no ExpandableListView.addChildFooterView()
method, or even ExpandableListView.addFooterView()
for that matter. The method you are calling is the inherited ListView.addFooterView()
, which just adds the view as the last item in the entire list. It was not overridden for group/child behavior.
The simplest way to do this is probably just to build something into your ExpandableListAdapter
implementation so that getChildrenCount()
returns the data set size + 1, and then return the footer view in getChildView()
for the appropriate position. Also, getChildView()
provides a boolean parameter to flag when it is retrieving the last child in any specific group.
I had made a custom adapter like this then pass its instance to my ExpandableListView
public class MyExpandableAdapter extends BaseExpandableListAdapter {
Context context;
List<ParentObject> parentObjects;
public MyExpandableAdapter(Context context, List<ParentObject> parentObjects)
{
this.context = context;
this.parentObjects = parentObjects;
}
@Override
public int getGroupCount() {
return parentObjects.size();
}
//Add 2 to childcount. The first row and the last row are used as header and footer to childview
@Override
public int getChildrenCount(int i) {
return parentObjects.get(i).childObjects.size() +2;
}
@Override
public ParentObject getGroup(int i) {
return parentObjects.get(i);
}
@Override
public ChildObject getChild(int i, int i2) {
return parentObjects.get(i).childObjects.get(i2);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i2) {
return 0;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup)
{
ParentObject currentParent = parentObjects.get(i);
if(view ==null)
{
LayoutInflater inflater =(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.parent_row,null);
}
TextView txtMother = (TextView)view.findViewById(R.id.txtMother);
TextView txtFather = (TextView)view.findViewById(R.id.txtFather);
txtMother.setText(currentParent.mother);
txtFather.setText(currentParent.father);
return view;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean b, View view, ViewGroup viewGroup) {
ParentObject currentParent = getGroup(groupPosition);
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//the first row is used as header
if(childPosition ==0)
{
view = inflater.inflate(R.layout.child_header, null);
TextView txtHeader = (TextView)view.findViewById(R.id.txtHeader);
txtHeader.setText(currentParent.textToHeader);
}
//Here is the ListView of the ChildView
if(childPosition>0 && childPosition<getChildrenCount(groupPosition)-1)
{
ChildObject currentChild = getChild(groupPosition,childPosition-1);
view = inflater.inflate(R.layout.child_row,null);
TextView txtChildName = (TextView)view.findViewById(R.id.txtChildName);
TextView txtChildAge = (TextView)view.findViewById(R.id.txtChildAge);
txtChildName.setText(currentChild.childName);
txtChildAge.setText("Age: " + String.valueOf(currentChild.age));
}
//the last row is used as footer
if(childPosition == getChildrenCount(groupPosition)-1)
{
view = inflater.inflate(R.layout.child_footer,null);
TextView txtFooter = (TextView)view.findViewById(R.id.txtFooter);
txtFooter.setText(currentParent.textToFooter);
}
return view;
}
@Override
public boolean isChildSelectable(int i, int i2) {
return false;
}
}
Here is solution to the issue http://robusttechhouse.com/how-to-add-header-footer-to-expandablelistview-childview/. Hope that helps!
There is a way more easier solution:
Just set a "OnClickListener" to the applied View:
View view = inflater.inflate(R.layout.xxx, null);
view.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//do something
}
});
Very easy thing which solved it!
精彩评论