ExpandableListView -UnsupportedOperationException: addView(View, LayoutParams) не поддерживается в AdapterView

Я реализую представление «Расширяемый список» в Android и получаю указанную выше ошибку. Пожалуйста помогите.

Основная деятельность -

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 - я реализовал адаптер в другом классе и вызвал его в основной деятельности mt.

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;
        }




    }

основной.xml-

это xnl, который отображается в первую очередь основной активностью

  <?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>

группа_строка.xml

это xml для элементов группы

 <?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 это xml для дочерних элементов

<?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>

person Gaurav Arora    schedule 20.04.2012    source источник
comment
Ошибка возникает из-за you have added empty view at wrong place. Вы должны not поместить empty view между начальным и закрывающим тегами ExpandableListView. Ставьте его после закрывающего тега ExpandableListView.   -  person Mehul Joisar    schedule 16.02.2015


Ответы (5)


Похоже, что Adapterview не позволяет добавлять новое представление, я столкнулся с той же проблемой.

Решите это, заменив следующую строку

convertView  = inflator.inflate(R.layout.child_rows, parent);

to

convertView  = inflator.inflate(R.layout.child_rows, null);

ОБНОВЛЕНИЕ

Вместо того, чтобы вообще не использовать родителя, вы должны просто указать Inflater не присоединять раздутое представление к родителю с помощью

convertView = inflator.inflate(R.layout.child_rows, parent, false); 

См. также этот ответ.

Причина в том, что адаптер сам заботится о присоединении представлений к родителю.

person Prashant Gami    schedule 16.05.2012
comment
Вместо того, чтобы вообще не использовать родителя, вы должны просто указать Inflater не присоединять раздутое представление к родителю с помощью convertView = inflator.inflate(R.layout.child_rows, parent, false);. См. также этот ответ. - person blubb; 28.05.2013
comment
Когда есть причина установить это в true? - person user1007522; 06.05.2014
comment
Обычно инфлятор работает следующим образом: если вы предоставляете родительскую ссылку, он добавит это представление к родителю. В этом случае возвращаемый объект, который вы получите, будет родительским объектом с добавленным к нему дочерним, а не добавленным вами дочерним объектом представления. Обычно это используется, когда вы просто хотите добавить представления в объект группы просмотра, например linearlayout. - person Prashant Gami; 09.05.2014

Обратите внимание, что вы также можете получить эту ошибку, если ваш XML-макет недействителен.

person Justin    schedule 28.03.2014

Как было отмечено выше,

Вместо того, чтобы вообще не использовать родителя, вы должны просто указать Inflater не присоединять раздутое представление к родителю с помощью

 convertView = inflator.inflate(R.layout.child_rows, parent, false);     

См. также этот ответ.

Причина в том, что адаптер сам заботится о присоединении представлений к родителю.

person B-GangsteR    schedule 01.08.2017

Согласно Android Lint, ваш дочерний вид всегда должен предоставлять ссылку на его родительский вид при раздувании. У меня была точно такая же ошибка в моем коде. Это происходило из-за того, что TextView был помещен внутри ExpandableListView. Когда я изменил свой макет xml, ошибка перестала появляться.

person sirFunkenstine    schedule 08.07.2014

Эта ошибка также может быть вызвана функцией мгновенного запуска. Я работал над списком, и из-за этой ошибки приложение продолжало падать. Удаление приложения и повторный запуск устранили ошибку.

person Illegal Argument    schedule 29.07.2016