9

Używam rozbudowy ListView znaleźć na przykład nettojava.lang.UnsupportedOperationException: addView (View, LayoutParams) nie jest obsługiwana w AdapterView

działalność:

public class ExpandableListViewActivity extends ExpandableListActivity { 
    /** 
    * strings for group elements 
    */ 
    static final String arrGroupelements[] = { "India", "Australia", "England", 
      "South Africa" }; 

    /** 
    * strings for child elements 
    */ 
    static final String arrChildelements[][] = { 
      { "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 expList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     expList = getExpandableListView(); 
     metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     width = metrics.widthPixels; 
     // this code for adjusting the group indicator into right side of the 
     // view 
     expList.setIndicatorBounds(width - GetDipsFromPixel(50), width 
       - GetDipsFromPixel(10)); 
     expList.setAdapter(new ExpAdapter(this)); 

     expList.setOnGroupExpandListener(new OnGroupExpandListener() { 
      public void onGroupExpand(int groupPosition) { 
       Log.e("onGroupExpand", "OK"); 
      } 
     }); 

     expList.setOnGroupCollapseListener(new OnGroupCollapseListener() { 
      public void onGroupCollapse(int groupPosition) { 
       Log.e("onGroupCollapse", "OK"); 
      } 
     }); 

     expList.setOnChildClickListener(new OnChildClickListener() { 
      public boolean onChildClick(ExpandableListView parent, View v, 
        int groupPosition, int childPosition, long id) { 
       Log.e("OnChildClickListener", "OK"); 
       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); 
    } 
} 

Adapter:

public class ExpAdapter extends BaseExpandableListAdapter { 

    private Context myContext; 

    public ExpAdapter(Context context) { 
     myContext = context; 
    } 

    public Object getChild(int groupPosition, int childPosition) { 
     return null; 
    } 

    public long getChildId(int groupPosition, int childPosition) { 
     return 0; 
    } 

    public View getChildView(int groupPosition, int childPosition, 
      boolean isLastChild, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) myContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.child_row, null); 
     } 

     TextView tvPlayerName = (TextView) convertView 
       .findViewById(R.id.tvPlayerName); 
     tvPlayerName 
       .setText(ExpandableListViewActivity.arrChildelements[groupPosition][childPosition]); 

     return convertView; 
    } 

    public int getChildrenCount(int groupPosition) { 
     return ExpandableListViewActivity.arrChildelements[groupPosition].length; 
    } 

    public Object getGroup(int groupPosition) { 
     return null; 
    } 

    public int getGroupCount() { 
     return ExpandableListViewActivity.arrGroupelements.length; 
    } 

    public long getGroupId(int groupPosition) { 
     return 0; 
    } 

    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) myContext 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.group_row, null); 
     } 

     TextView tvGroupName = (TextView) convertView 
       .findViewById(R.id.tvGroupName); 
     tvGroupName 
       .setText(ExpandableListViewActivity.arrGroupelements[groupPosition]); 

     return convertView; 
    } 

    public boolean hasStableIds() { 
     return false; 
    } 

    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 
} 

main.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="fill_parent" 
    android:orientation="vertical" > 

    <ExpandableListView 
     android:id="@+id/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:groupIndicator="@drawable/group_indicator" > 

     <TextView 
      android:id="@+id/android:empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="No Items" > 
     </TextView> 
    </ExpandableListView> 

</LinearLayout> 

próbowałem tego rozwiązania, ale nie działa :(

Android: Custom ListAdapter extending BaseAdapter crashes on application launch

tam jej powiedziano, aby dodać trzeci parametr "false", do inflater.inflate (R.layout.group_row, null, false);

+0

Czy to cały kod w tej czynności? Kod z drugiego pytania to 'inflater.inflate (R.layout.group_row, parent, false);' – Luksprog

+0

Przepraszam, że nie rozumiem twojego komentarza .... ale kiedy debugowałem używając logu, błąd jest związany z setContentView (R .layout.main) w działaniu ... więc wkleiłem plik main.xml w pytaniu ... możesz pomóc? –

Odpowiedz

17

Przesuń TextView zewnątrz elementu ExpandableListView:

<?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/android:list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:groupIndicator="@drawable/group_indicator" > 
    </ExpandableListView> 
    <TextView 
      android:id="@+id/android:empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="No Items" > 
    </TextView> 
</LinearLayout> 

podklasy AdapterView (jak ExpandableListView) nie mogą mieć dzieci w układzie xml (jak to zrobiłeś w układzie).

0

Jeśli jesteś podobny do mnie i znaleźć na to pytanie bez użycia ExpandableListView, spróbuj dodać trzeci parametr do metody inflate, jak wspomina @Luksprog, również wspomniane here:

inflater.inflate(R.layout.group_row, parent, false); 

Nie używaj true zamiast false otrzymasz ten sam błąd, który przyniósł ci tutaj, ponieważ próbuje dołączyć/dodać go do rodzica, stąd błąd addView is not supported in AdapterView.