2012-04-20 5 views
59

Я реализую просмотр расширяемого списка в android, и я получаю вышеупомянутую ошибку. Пожалуйста, помогите мне.ExpandableListView -UnsupportedOperationException: addView (View, LayoutParams) не поддерживается в AdapterView

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

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

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-

это 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> 

group_row.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> 
+0

Ошибка появляется, потому что ** «вы добавили пустой вид в неправильное место» **. Вы должны ** 'not' ** помещать' empty view' между начальным и закрывающим тегами 'ExpandableListView'.Поместите его после закрытия тега 'ExpandableListView'. –

ответ

127

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

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

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

в

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

Вместо того, чтобы вообще не использовать родителя, вы должны просто сказать Inflater не прикреплять раздутый вид к родительскому с помощью 'convertView = inflator.inflate (R.layout.child_rows, parent, false);'. См. Также [этот ответ] (http://stackoverflow.com/a/6419586/484293). – blubb

+1

Когда есть причина установить это в true? – user1007522

+3

Обычно, как работает инфлятор, если вы предоставляете родительскую ссылку, она добавит этот вид к родительскому. В этом случае возвращаемый объект, который вы получите, будет родительским объектом с добавленным дочерним элементом, а не дочерним объектом просмотра, который вы добавили. Обычно это используется, когда вы просто хотите добавлять представления к объекту viewgroup, например linearlayout. –

11

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

0

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

0

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

2

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

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

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

См. Также answer.

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