Reputation: 4536
I am developing an app which contain a expandable list view.
In my expandable list view, I want to set different layout for each child view.
My custom Expandable list adapter is given below:
public Object getGroup(int arg0)
{
// TODO Auto-generated method stub
return menu[arg0];
}
public int getGroupCount()
{
// TODO Auto-generated method stub
return menu.length;
}
public long getGroupId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getGroupView(int position, boolean arg1, View view, ViewGroup parent)
{
if(view==null)
{
view = inflater.inflate(R.layout.edit_head, null);
}
TextView head = (TextView)view.findViewById(R.id.list_item_text_view_head);
head.setText(menu[position]);
return view;
}
public Object getChild(int arg0, int arg1) {
// TODO Auto-generated method stub
return null;
}
public long getChildId(int arg0, int arg1) {
// TODO Auto-generated method stub
return 0;
}
public View getChildView(int groupPosition, int childPosition, boolean arg2, View childView,
ViewGroup parent)
{
if(childView==null)
{
childView = inflater.inflate(R.layout.edit_child, null, false);
}
return childView;
}
But click on the list it doesn't show its child.
Upvotes: 0
Views: 674
Reputation: 476
You can create you own adapter:
public class ExpandableAdapter extends BaseExpandableListAdapter {
@SuppressWarnings("unused")
private Context context;
private ArrayList<String> groups;
private ArrayList<ArrayList<Expand>> expand;
private LayoutInflater inflater;
public ExpandableAdapter(Context context,
ArrayList<String> groups,
ArrayList<ArrayList<Expand>> expand) {
this.context = context;
this.groups = groups;
this.expand = expand;
inflater = LayoutInflater.from( context );
}
public Object getChild(int groupPosition, int childPosition) {
return expand.get( groupPosition ).get( childPosition );
}
public long getChildId(int groupPosition, int childPosition) {
return (long)( groupPosition*50+childPosition );
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
View v = null;
if( convertView != null )
v = convertView;
else
v = inflater.inflate(R.layout.child_row, parent, false);
Expand c = (Expand)getChild( groupPosition, childPosition);
TextView color = (TextView)v.findViewById( R.id.grp_child_primero);
if( color != null )
color.setText( c.getTitulo());
TextView rgb = (TextView)v.findViewById( R.id.grp_child_segundo);
if( rgb != null )
rgb.setText( c.getDato());
return v;
}
public int getChildrenCount(int groupPosition) {
return expand.get( groupPosition ).size();
}
public Object getGroup(int groupPosition) {
return groups.get( groupPosition );
}
public int getGroupCount() {
return groups.size();
}
public long getGroupId(int groupPosition) {
return (long)( groupPosition*50 );
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
View v = null;
if( convertView != null )
v = convertView;
else
v = inflater.inflate(R.layout.group_row, parent, false);
String gt = (String)getGroup( groupPosition );
TextView expandGroup = (TextView)v.findViewById( R.id.grp_child_primero);
if( gt != null )
expandGroup.setText( gt );
return v;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public void onGroupCollapsed (int groupPosition) {}
public void onGroupExpanded(int groupPosition) {}
}
With one xml for rows:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/negro">
<TextView android:id="@+id/grp_child_primero"
android:focusable="false"
android:textSize="20sp"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/negro"/>
<TextView android:id="@+id/grp_child_segundo"
android:focusable="false"
android:textSize="18sp"
android:textStyle="normal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/negro"/>
</LinearLayout>
And other for groups:
<?xml version="1.0" encoding="utf-
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/negro">
<TextView android:id="@+id/grp_child_primero"
android:layout_width="wrap_content"
android:paddingLeft="30dp"
android:textSize="20sp"
android:textColor="@drawable/blanco"
android:textStyle="normal"
android:layout_height="wrap_content"
android:gravity="center_horizontal|center_vertical"
android:background="@drawable/negro"/>
</LinearLayout>
And after that:
ExpandAdapter youadapter = new ExpandAdapter(getApplicationContext(),
namesGroups, nameChilds);
setListAdapter(youadapter);
Where namesGroups and nameChilds are list the data for rows and groups. With the method setListAdapter, you can set the adapter to the ExpandableListActivity ;) And finally Expand class is a simple POJO:
public class Expand {
public String titulo = null;
public String dato = null;
public Expand( String titulo, String dato) {
this.titulo = titulo;
this.dato = dato;
}
public String getTitulo() {
return titulo;
}
public String getDato() {
return dato;
}
}
Looks primarily as getChildView method (in ExpandableAdapter class) is implemented, and some inside if you do not think it is complicated to implement what you want
Upvotes: 2