2012-04-20 11 views
59

Sto implementando la vista Elenco espandibile in Android e sto ricevendo l'errore con il titolo sopra riportato. Mi aiuti per favore.ExpandableListView -UnsupportedOperationException: addView (View, LayoutParams) non è supportato in AdapterView

Attività principale è -

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


} 

classe ExpAdapter è - ho implementato l'adattatore in altra classe e ho chiamato in attività principale 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; 
     } 




    } 

main.xml-

questo è il xnl che viene visualizzata al primo dall'attività 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

questo è l'XML per gli elementi del gruppo

<?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 questo è l'XML per gli elementi figli

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

L'errore è visualizzato perché ** 'hai aggiunto una vista vuota nel posto sbagliato **. Dovresti ** 'not' ** mettere' empty view' tra i tag di apertura e chiusura di 'ExpandableListView'.Mettilo dopo aver chiuso il tag di 'ExpandableListView'. –

risposta

127

Sembra come Adapterview fa non permetto di aggiungere nuova visione, ho incontrato lo stesso problema

risolverlo sostituendo seguente riga

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

a

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

Invece di non usare affatto un genitore, dovresti semplicemente dire al Inflater di non allegare la vista gonfiata al genitore con 'convertView = inflator.inflate (R.layout.child_rows, parent, false);'. Vedi anche [questa risposta] (http://stackoverflow.com/a/6419586/484293). – blubb

+1

Quando c'è un motivo per impostare questo su true? – user1007522

+3

In genere, il modo in cui funziona Inflator se si fornisce un riferimento padre, aggiungerà quella vista al genitore. In tal caso, l'oggetto restituito ottenuto sarà l'oggetto padre con il figlio aggiunto ad esso non l'oggetto vista figlio aggiunto. Solitamente viene utilizzato quando si desidera semplicemente aggiungere viste all'oggetto viewgroup come linearlayout. –

11

Si noti che è anche possibile ottenere questo errore quando il layout XML non è valido.

0

Secondo Android Lint la visualizzazione bambino dovrebbe sempre fornire un riferimento alla sua vista padre quando gonfiato. Ho avuto lo stesso errore nel mio codice. Is stava accadendo perché il TextView è stata posta all'interno del ExpandableListView. Quando ho riorganizzato il mio layout xml, l'errore ha smesso di apparire.

0

Questo errore può anche essere causato dalla funzione esecuzione istantanea. Stavo lavorando su ListView ed a causa di questo errore applicazione continuato a schiantarsi. La disinstallazione dell'app e il riavvio hanno risolto l'errore.

2

Come sono stati notati in precedenza,

Invece di non usare un genitore a tutti, si dovrebbe semplicemente dire al Inflater di non collegare la vista gonfiato al genitore con

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

Vedi anche questo answer.

Il motivo è che l'adattatore si occupa di allegare le viste al genitore stesso.