2015-02-24 3 views
0

У меня есть фрагмент с scrollview как родительский макет, а в scrollview у меня есть LinearLayout. когда я пытаюсь программно добавить представление к этому LinearLayout, но я получаю ошибку «У указанного дочернего элемента уже есть родительский элемент. Сначала вы должны вызвать removeView() для родителя ребенка».Android: не удается добавить просмотр программно в linearLayout android

это мой макет

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layoutDirection="ltr" 
tools:context="ir.pnuopen5.application.fragment.LeaugeFragment"> 

<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin"> 

    <TextView 
     android:id="@+id/tv_LeagueFragment_title_lastNews" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/last_news" 
     android:textSize="17sp" 
     android:layout_gravity="right" 
     android:layout_alignParentTop="true" 
     android:layout_alignRight="@+id/view1" 
     android:layout_alignEnd="@+id/view1" /> 

    <View 
     android:id="@+id/view1" 
     android:layout_width="match_parent" 
     android:layout_height="3dp" 
     android:layout_marginTop="10dp" 
     android:background="@color/line" 
     android:layout_below="@+id/tv_LeagueFragment_title_lastNews" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/lv_LeagueFragment_lastNews" 
     android:layout_below="@+id/view1" 
     android:orientation="horizontal"/> 

    ... 

и это мой Java-код

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_leauge, container, false); 

    ... 

    LinearLayout newsListView = (LinearLayout)view.findViewById(R.id.lv_LeagueFragment_lastNews); 
    View newsListRow; 
    TextView title,time; 


    for (int i = 0;i<newsList.size();i++){ 
     newsListRow = inflater.inflate(R.layout.list_news_row0, container, false); 
     title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle); 
     time = (TextView)newsListRow.findViewById(R.id.rowNewsTime); 
     title.setText(newsList.get(i).getTitle()); 
     time.setText(newsList.get(i).getTime()); 
     newsListView.addView(newsListView); 
    } 

    ... 

    return view; 
} 
+1

'inflater.inflate (R.layout.list_news_row0, контейнер, ложь) ; '=>' container'? не 'newsListView'? 'newsListView.addView (newsListView);' <= серьезно вы wana добавляете представление самому себе? также используйте ListView вместо – Selvin

+0

newsListView.addView (newsListView); ?? !! –

+0

@Selvin Мне нужно что-то вроде listview, но перед добавлением представления не следует прокручивать – user2549089

ответ

1

В фрагменте кода newsListView.addView(newsListView), вы добавляете взгляд к себе. Я думаю, что вы имели в виду, чтобы сделать было:

newsListView.addView(newsListRow); 

... чтобы вернуть его в контексте ...

for (int i = 0;i<newsList.size();i++){ 
    newsListRow = inflater.inflate(R.layout.list_news_row0, container, false); 
    title = (TextView)newsListRow.findViewById(R.id.rowNewsTitle); 
    time = (TextView)newsListRow.findViewById(R.id.rowNewsTime); 
    title.setText(newsList.get(i).getTitle()); 
    time.setText(newsList.get(i).getTime()); 
    newsListView.addView(newsListRow); 
} 
0

Очевидно, что вы получите эту ошибку. Посмотрите, как вы раздуваете представление, в первый раз, когда цикл работает, он добавляет этот вид в ваш линейный макет. Когда в следующий раз ваш цикл запускается, он принимает тот же объект этого вида, который вы ранее добавили. Поскольку это статический вид, он не будет создавать новый объект при его инициализации.

Вы должны использовать динамический вид.

После ваш ответ

for(int i = 0;i<newsList.size();i++) { 
     LinearLayout newsListRow = new LinearLayout(this); 
     TextView title = new TextView(this); 
     TextView time = new TextView(this); 

     title.setText(newsList.get(i).getTitle()); 
     time.setText(newsList.get(i).getTime()); 

     newsListRow.addView(title); 
     newsListRow.addView(time); 

     newsListView.addView(newsListView); 
    } 

Вы можете добавить LayoutParameter, чтобы сделать его похожим на ваш статический взгляд строки.

Вот это ... Наслаждайтесь ... :-)

+0

На самом деле раздувать один и тот же xml в цикле будет каждый раз создавать новый объект. Это не нужно делать в коде вместо xml. –

0

Перед добавлением вид, удалите его с помощью вызова

newsListView.removeView(view); 
Смежные вопросы