我收到此错误但我不确定原因:
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
我添加View的部分是错误指向的行。我正在提供我的适配器代码,以便你们能够更好地了解我正在做什么以及为什么我会收到此错误。如果需要更多信息,请告诉我。提前谢谢。
适配器
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>
答案 0 :(得分:4)
你没有说当你得到那个例外(当应用程序启动时或者你上下滚动GridView
时),但这是正常的。 views
数组有一个不是null
的值(该数组中的第一个条目设置为您创建的TextView
)并且很可能您将尝试重新添加在某些时候TextView
。此外,家长AdapterView
可能会多次调用getView
方法以让一些孩子进行衡量。
无论如何,你不确切地知道你想要做什么,但目前的方法是错误的。
首先,您创建一个数组,其中一个TextView
,其余值设置为null
,您基本上不会对其执行任何其他操作(但可能这不是完整代码?!)。其次,你不应该存储一个Views
数组,特别是在AdapterView
(如GridView
,ListView
等)的孩子中,它有一个回收其子女的机制。第三,你没有考虑GridView
的回收机制。例如,您为第一个元素添加TextView
,但未在getView
中恢复此更改,因此如果第一行View
(包含添加的TextView
)获得回收,你最终会得到一行View
,其中包含您不想要的行中之前添加的TextView
。
答案 1 :(得分:1)
我已经接受了答案,但我认为我会添加这个,因为它有助于解释有关ListView
(以及定义,GridView)的一些内容,有人了解它可以理解。我对在ListView中回收视图感到困惑,我发现this文章很棒。解释得很好。希望它可以帮助任何人不完全理解ListView和Adapters如何工作,这对我来说是个明显的问题。