ExpandableListView -UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView

AndroidExpandablelistviewAndroid Adapterview

Android Problem Overview


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>

Android Solutions


Solution 1 - Android

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.

Solution 2 - Android

Note that you can also get this error when your layout xml is invalid.

Solution 3 - Android

As were noted above, > 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.

Solution 4 - Android

According to Android Lint your child view should always provide a reference to its parent view when inflated. I had the exact same error in my code. Is was occurring because the TextView was placed inside the ExpandableListView. When I rearranged my xml layout the error stopped appearing.

Solution 5 - Android

This error can also be caused because of instant run feature. I was working on listview and because of this error app kept crashing. Uninstalling the app and running again resolved the error.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGaurav AroraView Question on Stackoverflow
Solution 1 - AndroidPrashant GamiView Answer on Stackoverflow
Solution 2 - AndroidJustinView Answer on Stackoverflow
Solution 3 - AndroidB-GangsteRView Answer on Stackoverflow
Solution 4 - AndroidsirFunkenstineView Answer on Stackoverflow
Solution 5 - AndroidIllegal ArgumentView Answer on Stackoverflow