I am implementing Expandable List view in android and i am getting the above titled error. Please help me.
Main activity is -
package com.expand; import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; import android.widget.ExpandableListView; import android.widget.Toast; public class MyExpandableListViewActivity extends Activity { /** Called when the activity is first created. */ static final String groupElements[]= { "India", "Australia", "England", "South Africa" }; static final String[][] childElements= { { "Sachin Tendulkar", "Raina", "Dhoni", "Yuvi" }, { "Ponting", "Adam Gilchrist", "Michael Clarke" }, { "Andrew Strauss", "kevin Peterson", "Nasser Hussain" }, { "Graeme Smith", "AB de villiers", "Jacques Kallis" } }; DisplayMetrics metrics; int width; ExpandableListView expandList; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); expandList = (ExpandableListView)findViewById(R.id.expandList1); metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); width = metrics.widthPixels; //ExpAdapter adapter = new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements); expandList.setAdapter(new ExpAdapter(MyExpandableListViewActivity.this, groupElements, childElements)); expandList.setIndicatorBounds(width - GetDipsFromPixel(50), width - GetDipsFromPixel(10)); expandList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { // TODO Auto-generated method stub Log.e("onGroupExpand", "OK"); } }); expandList.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() { @Override public void onGroupCollapse(int groupPosition) { // TODO Auto-generated method stub Log.e("onGroupCollapse", "OK"); } }); expandList.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { //getting the item that is selected //String s = (String) expandList.getItemAtPosition((int) id); Toast.makeText(MyExpandableListViewActivity.this, "You have selected :" , Toast.LENGTH_SHORT).show(); return false; } }); } public int GetDipsFromPixel(float pixels) { // Get the screen's density scale final float scale = getResources().getDisplayMetrics().density; // Convert the dps to pixels, based on density scale return (int) (pixels * scale + 0.5f); } }
ExpAdapter class is - I have implemented the adapter in other class and have called it in mt main activity
package com.expand; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; public class ExpAdapter extends BaseExpandableListAdapter { public Context myContext; public String[][] childElements; TextView childValues; public String[] groupElements; public ExpAdapter(Context context, String[] group, String[][] childs) { this.myContext=context; this.groupElements = group; this.childElements = childs; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childElements[groupPosition][childPosition]; } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return 0; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null){ LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflator.inflate(R.layout.child_rows, parent); } childValues = (TextView)convertView.findViewById(R.id.rowValues); childValues.setText(childElements[groupPosition][childPosition]); return convertView; } @Override public int getChildrenCount(int groupPosition) { // TODO Auto-generated method stub return groupElements[groupPosition].length(); } @Override public Object getGroup(int groupPosition) { // TODO Auto-generated method stub return groupElements[groupPosition]; } @Override public int getGroupCount() { // TODO Auto-generated method stub return groupElements.length; } @Override public long getGroupId(int groupPosition) { // TODO Auto-generated method stub return 0; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { // TODO Auto-generated method stub if(convertView==null){ LayoutInflater inflator = (LayoutInflater)myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflator.inflate(R.layout.group_rows, null); } TextView group = (TextView)convertView.findViewById(R.id.groupId); group.setText(groupElements[groupPosition]); return convertView; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return true; } }
main.xml-
this is the xnl that is displayed at the first by the main activity
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ExpandableListView android:id="@+id/expandList1" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/android:empty" android:layout_width="fill_parent" android:layout_height="fill_parent" > </TextView> </ExpandableListView> </LinearLayout>
group_row.xml
this is the xml for the group elements
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/gropu_name" android:layout_width="fill_parent" android:layout_height="40dp" android:orientation="vertical" > <TextView android:id="@+id/groupId" android:layout_height="40dp" android:layout_width="wrap_content" android:paddingLeft="30dp" android:gravity="center_vertical" android:textSize="16dp" android:textStyle="bold" /> </LinearLayout>
child_row.xml this is the xml for the child elements
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="40dp" android:orientation="horizontal" > <TextView android:id="@+id/rowValues" android:layout_width="wrap_content" android:layout_height="30dp" android:gravity="center_vertical" android:paddingLeft="50dp" android:textSize="12dp" /> </LinearLayout>
Seems like Adapterview does not allow adding new view, I encountered same problem
Solve it by replacing following line
convertView = inflator.inflate(R.layout.child_rows, parent);
to
convertView = inflator.inflate(R.layout.child_rows, null);
UPDATE
Instead of not using a parent at all, you should simply tell the Inflater not to attach the inflated view to the parent with
convertView = inflator.inflate(R.layout.child_rows, parent, false);
See also this answer.
The reason is that adapter takes care of attaching views to parent itself.
Note that you can also get this error when your layout xml is invalid.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With