java.lang.UnsupportedOperationException:AdapterView不支持addView(View,LayoutParams)

时间:2012-06-22 10:22:13

标签: android exception expandablelistview android-adapterview

我正在使用net

上的Expandable ListView示例

的活动:

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

适配器:

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>

我尝试了这个解决方案,但没有奏效:(

Android: Custom ListAdapter extending BaseAdapter crashes on application launch

告诉它将第三个参数“false”添加到inflater.inflate(R.layout.group_row,null,false);

2 个答案:

答案 0 :(得分:17)

TextView移到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>

AdapterView的子类(如ExpandableListView)不能在xml布局中生成子项(就像在布局中那样)。

答案 1 :(得分:0)

如果您不喜欢我并且在不使用ExpandableListView的情况下发现此问题,请尝试使用第三个参数添加inflate方法,如@Luksprog所述,同时提到here

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

请勿使用true代替false,否则您会收到相同的错误,因为它会尝试将其附加/添加到父级,因此addView is not supported in AdapterView错误。