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配列にはそうでない値が 1 つあります(そのnull配列の最初のエントリは、作成したものに設定されてTextViewいます)。おそらくTextView、ある時点でそれを再度追加しようとします。また、親AdapterViewがメソッドを数回呼び出して、getView一部の子を測定することもできます。

とにかく、何をしようとしているのか正確にはわかりませんが、現在のアプローチは間違っています。

TextViewまず、1 つの値と残りの値を に設定して配列を作成し、null基本的にそれ以外には何もしません (しかし、これは完全なコードではないのでしょうか?!)。第 2 に、特に(などの)Viewsの子内に配列を格納しないでください。これには、子をリサイクルするメカニズムがあります。第三に、あなたは のリサイクル メカニズムを考慮していませんでした。たとえば、最初の要素に を追加しますが、この変更を元に戻さないため、この最初の行(追加された を含む) がリサイクルされると、以前に追加された at 行を含む行になります。欲しくない。AdapterViewGridViewListViewGridViewTextViewgetViewViewTextViewViewTextView

于 2012-08-12T06:24:48.947 に答える
1

ListView私はすでに答えを受け入れましたが、それについて学んでいる人が理解できるいくつかのこと(そして定義上、GridViewも)を説明するのに役立つので、これを追加すると思いました。私は ListView でのビューのリサイクルについて混乱していましたが、私が見つけたこの記事は素晴らしいものです。よく説明しています。ListView と Adapters がどのように機能するかを完全に理解していない人に役立つことを願っています。これは私にとって明らかな問題でした。

于 2012-08-13T19:02:04.210 に答える