59 votes

ExpandableListView -UnsupportedOperationException : addView(View, LayoutParams) n'est pas supporté dans AdapterView

J'implémente une vue de liste extensible dans Android et j'obtiens l'erreur ci-dessus. Veuillez m'aider.

L'activité principale est -

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

}

La classe ExpAdapter est - J'ai implémenté l'adaptateur dans une autre classe et je l'ai appelé dans mon activité principale.

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-

voici le xnl qui est affiché au début par l'activité principale

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

voici le xml pour les éléments du groupe

 <?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 c'est le xml pour les éléments enfants

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

0 votes

L'erreur apparaît parce que you have added empty view at wrong place . Vous devez not mettre empty view entre les balises de début et de fin de l'article ExpandableListView . Mettez-le après la balise de fermeture de ExpandableListView .

128voto

Prashant Gami Points 784

Il semble que Adapterview ne permette pas d'ajouter une nouvelle vue, J'ai rencontré le même problème

Résolvez-le en remplaçant la ligne suivante

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

à

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

UPDATE

Au lieu de ne pas utiliser de parent du tout, vous devriez simplement indiquer au gonfleur de ne pas attacher la vue gonflée au parent avec

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

Voir aussi réponse .

La raison en est que l'adaptateur se charge d'attacher les vues au parent lui-même.

116 votes

Au lieu de ne pas utiliser de parent du tout, vous devriez simplement indiquer au gonfleur de ne pas attacher la vue gonflée au parent avec convertView = inflator.inflate(R.layout.child_rows, parent, false); . Voir aussi cette réponse .

1 votes

Quand y a-t-il une raison de mettre cette valeur à true ?

3 votes

Habituellement, le fonctionnement de l'inflateur est le suivant : si vous fournissez une référence parent, il ajoutera cette vue au parent. Dans ce cas, l'objet de retour que vous obtiendrez sera l'objet parent auquel sera ajouté l'enfant, et non l'objet de vue enfant que vous avez ajouté. Habituellement, cela est utilisé lorsque vous voulez simplement ajouter des vues à un objet de groupe de vues comme linearlayout.

11voto

Justin Points 3172

Notez que vous pouvez également obtenir cette erreur lorsque votre layout xml est invalide.

2voto

B-GangsteR Points 1073

Comme on l'a vu plus haut,

Au lieu de ne pas utiliser de parent du tout, vous devez simplement indiquer à l'élément gonflable Inflater de ne pas attacher la vue gonflée au parent avec la commande

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

Voir aussi réponse .

La raison en est que l'adaptateur se charge d'attacher les vues au parent lui-même.

0voto

sirFunkenstine Points 474

Selon Android Lint, votre vue enfant doit toujours fournir une référence à sa vue parent lorsqu'elle est gonflée. J'avais exactement la même erreur dans mon code. Elle se produisait parce que le TextView était placé à l'intérieur de l'ExpandableListView. Lorsque j'ai réorganisé mon layout xml, l'erreur a cessé d'apparaître.

0voto

Illegal Argument Points 4244

Cette erreur peut également être causée par course instantanée fonction. Je travaillais sur une liste et à cause de cette erreur, l'application n'arrêtait pas de planter. Désinstaller l'application et la relancer a résolu l'erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X