0

我收到此错误,但我不确定原因:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我添加视图的部分是错误指向的行。我提供我的适配器代码是为了让你们更好地了解我在做什么以及为什么我会收到这个错误。如果需要更多信息,请告诉我。提前致谢。

适配器

private class InnerAdapter extends BaseAdapter{
    String[] array = new String[] {"12\nAM","1\nAM", "2\nAM", "3\nAM", "4\nAM", "5\nAM", 
                                "6\nAM", "7\nAM", "8\nAM", "9\nAM", "10\nAM", "11\nAM",
                                "12\nPM", "1\nPM", "2\nPM", "3\nPM", "4\nPM", "5\nPM",
                                "6\nPM", "7\nPM", "8\nPM", "9\nPM", "10\nPM", "11\nPM"};
    TextView[] views = new TextView[24];

    public InnerAdapter() {
        TextView create = new TextView(DayViewActivity.this);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 62, getResources().getDisplayMetrics()), 1.0f);
        params.topMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
        params.bottomMargin = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, getResources().getDisplayMetrics());
        create.setLayoutParams(params);
        create.setBackgroundColor(Color.BLUE);
        create.setText("Test");
        views[0] = create;
        for(int i = 1; i < views.length; i++) {
            views[i] = null;
        }
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return array.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            convertView = inflater.inflate(R.layout.day_view_item, parent, false);
        }

        ((TextView)convertView.findViewById(R.id.day_hour_side)).setText(array[position]);
        LinearLayout layout = (LinearLayout)convertView.findViewById(R.id.day_event_layout);
        if(views[position] != null) {
            layout.addView((TextView)views[position], position);
        }

        return convertView;
    }

}

XML

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="61dp"
    android:orientation="horizontal" >



    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="61dp"
        android:orientation="vertical">
        <TextView 
            android:id="@+id/day_hour_side"
            android:layout_width="wrap_content"
            android:layout_height="60dp"
            android:text="12AM"
            android:background="#bebebe"
            android:layout_weight="0"
            android:textSize="10dp"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"/>
        <TextView 
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:layout_weight="0"
            android:background="#000000"
            android:id="@+id/hour_side_divider"/>
    </LinearLayout>
    <LinearLayout 
        android:layout_width="0dp"
        android:layout_height="61dp"
        android:orientation="vertical"
        android:layout_weight="1">
        <LinearLayout 
            android:id="@+id/day_event_layout"
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:orientation="horizontal" ></LinearLayout>
        <TextView 
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#000000"
            android:id="@+id/event_side_divider" />
    </LinearLayout>


</LinearLayout>
4

2 回答 2

4

您没有说何时收到该异常(应用程序启动时或上下滚动GridView时),但这很正常。该views数组有一个不是的值null(该数组中的第一个条目设置为您创建的那个)并且很可能您会在某个时候TextView尝试重新添加它。TextView父母也可以多次AdapterView调用该方法来让一些孩子进行测量。getView

无论如何,您并不确切知道您要做什么,但当前的方法是错误的。

首先,您创建一个数组,其中一个TextView和其余的值设置为,null并且您基本上不对它做任何其他事情(但也许这不是完整的代码?!)。其次,您不应该将数组存储Views在具有回收其子代的机制的AdapterView(likeGridView等) 的子代中。ListView第三,你没有考虑到GridView. 例如,您TextView为第一个元素添加了,但您没有恢复此更改,getView因此如果第一行View(包含添加的TextView)被回收,您最终将得到View包含先前添加TextView的行的行不想要。

于 2012-08-12T06:24:48.947 回答
1

我已经接受了一个答案,但我想我会添加这个,因为它有助于解释一些关于ListView(并且根据定义,GridView 也是如此)的东西,学习它的人可以理解。我对在 ListView 中回收 Views 感到困惑,我发现这篇文章很棒。解释得很好。希望它可以帮助任何不完全理解 ListView 和 Adapters 如何工作的人,这对我来说是一个明显的问题。

于 2012-08-13T19:02:04.210 回答