ExpandableListView -UnsupportedOperationException: addView(View, LayoutParams) wird in AdapterView nicht unterstützt

Lesezeit: 6 Minuten

Benutzer-Avatar
Gaurav Arora

Ich implementiere die erweiterbare Listenansicht in Android und erhalte den oben genannten Fehler. Bitte hilf mir.

Haupttätigkeit ist –

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-Klasse ist – Ich habe den Adapter in einer anderen Klasse implementiert und in der Hauptaktivität von mt aufgerufen

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-

Dies ist die xnl, die zuerst von der Hauptaktivität angezeigt wird

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

Dies ist das XML für die Gruppenelemente

 <?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 Dies ist die XML für die untergeordneten Elemente

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

  • Fehler wird angezeigt, weil you have added empty view at wrong place. Du solltest not stellen empty view zwischen den Start- und End-Tags von ExpandableListView. Setzen Sie es nach dem schließenden Tag von ExpandableListView.

    – Mehul Joisar

    16. Februar 2015 um 13:47 Uhr


Benutzer-Avatar
Prashant Gami

Scheint so, als ob Adapterview das Hinzufügen einer neuen Ansicht nicht zulässt, ich bin auf dasselbe Problem gestoßen

Lösen Sie es, indem Sie die folgende Zeile ersetzen

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

zu

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

AKTUALISIEREN

Anstatt überhaupt kein übergeordnetes Element zu verwenden, sollten Sie dem Inflater einfach sagen, dass es die aufgeblasene Ansicht nicht an das übergeordnete Element anhängen soll

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

Siehe auch diese Antwort.

Der Grund dafür ist, dass der Adapter sich selbst um das Anhängen von Ansichten an das übergeordnete Element kümmert.

  • Anstatt überhaupt kein übergeordnetes Element zu verwenden, sollten Sie dem Inflater einfach sagen, dass es die aufgeblasene Ansicht nicht an das übergeordnete Element anhängen soll convertView = inflator.inflate(R.layout.child_rows, parent, false);. Siehe auch diese Antwort.

    – blubb

    28. Mai 2013 um 14:42 Uhr


  • Wann gibt es einen Grund, dies auf wahr zu setzen?

    – Benutzer1007522

    6. Mai 2014 um 11:14 Uhr

  • Normalerweise funktioniert der Inflator so, dass wenn Sie eine übergeordnete Referenz angeben, diese Ansicht der übergeordneten Ansicht hinzugefügt wird. In diesem Fall ist das zurückgegebene Objekt, das Sie erhalten, ein übergeordnetes Objekt, dem ein untergeordnetes Objekt hinzugefügt wurde, nicht das von Ihnen hinzugefügte untergeordnete Ansichtsobjekt. Normalerweise wird dies verwendet, wenn Sie nur Ansichten zu einem Ansichtsgruppenobjekt wie linearlayout hinzufügen möchten.

    – Prashant Gami

    9. Mai 2014 um 0:40 Uhr


Beachten Sie, dass Sie diesen Fehler auch erhalten können, wenn Ihre Layout-XML ungültig ist.

Wie oben angemerkt,

Anstatt überhaupt kein übergeordnetes Element zu verwenden, sollten Sie dem Inflater einfach sagen, dass es die aufgeblasene Ansicht nicht an das übergeordnete Element anhängen soll

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

Siehe auch diese Antwort.

Der Grund dafür ist, dass der Adapter sich selbst um das Anhängen von Ansichten an das übergeordnete Element kümmert.

Laut Android Lint sollte Ihre Kinderansicht beim Aufblasen immer einen Verweis auf die Elternansicht liefern. Ich hatte genau den gleichen Fehler in meinem Code. Dies ist aufgetreten, weil die TextView innerhalb der ExpandableListView platziert wurde. Als ich mein XML-Layout neu anordnete, wurde der Fehler nicht mehr angezeigt.

Dieser Fehler kann auch verursacht werden durch sofortiger Lauf Besonderheit. Ich habe an Listview gearbeitet und aufgrund dieses Fehlers stürzte die App immer wieder ab. Durch Deinstallieren der App und erneutes Ausführen wurde der Fehler behoben.

1187550cookie-checkExpandableListView -UnsupportedOperationException: addView(View, LayoutParams) wird in AdapterView nicht unterstützt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy