2012-04-06 3 views
1

Я пытаюсь имитировать ListView в LinearLayout, чтобы показать три строки с одинаковым расположением. Этот единственный вид состоит из панели оценки и контента. Это очень странно, но все рейтинговые бары получают последнее присвоенное значение. Прежде всего это мой пользовательский компонент, который расширяет LinearLayout просто добавив эти два метода:Программно добавить представление в LinearLayout

public void setElements(List<Item> elements) { 
    removeAllViews(); 
    for (int i = 0; i < elements.size() && i < 3; i++) { 
     View vi = buildElementView(elements.get(i)); 
     vi.setId(i); 
     addView(vi); 
    } 
} 

private View buildElementView(Item itemElement) { 
    View view = inflater.inflate(R.layout.element_list_item, null, true); 
    // set values 
    View header = view.findViewById(R.id.header); 
    RatingBar ratingInItem = (RatingBar) header.findViewById(R.id.ratingBarInItem); 
    TextView content = (TextView) view.findViewById(R.id.content); 

    content.setText(itemElement.getContent()); 

    ratingInItem.setRating(itemElement.getRating()); 
    return view; 
} 

и это расположение я накачивания:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res/com.weorder.client" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/transparent" 
    android:minHeight="60.0dp" 
    android:orientation="vertical" 
    android:paddingBottom="8.0dp" 
    android:paddingLeft="5.0dp" 
    android:paddingRight="5.0dp" 
    android:paddingTop="8.0dp" > 

    <RelativeLayout 
     android:id="@+id/header" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" > 

     <RatingBar 
      android:id="@+id/ratingBarInItem" 
      style="@style/RatingBarSm" 
      android:isIndicator="true" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="3dp" 
      android:numStars="5" 
      android:stepSize="0.1" /> 

    </RelativeLayout> 

    <TextView 
     android:id="@+id/content" 
     style="@style/Content" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="3dp" 
     android:layout_marginTop="3dp" 

     android:textColor="@color/dark_brown" 
     android:textSize="@dimen/text_size_small" /> 

</LinearLayout> 

я вызываю метод setElements внутри onActivityCreated() в фрагмент. Он работает хорошо, когда начинается фрагмент, но когда я пытаюсь повернуть телефон, содержимое элементов изменяется должным образом, но панель рейтинга получает последнее значение (если есть 3 элемента с рейтингом 1,2 и 3, все рейтинговые бары имеют 3 звезды) , Это ошибка?

EDIT: это мой onSaveInstanceMethod:

@Override 
public void onSaveInstanceState(Bundle outState) { 

    if (elements != null) { 
     outState.putSerializable("elements", elements); 
    } 

    super.onSaveInstanceState(outState); 
} 

Благодаря

+0

Как сохранить рейтинги, когда активность убит ? – znat

+0

Рейтинги извлекаются из сети и сохраняются с помощью onsaveinstancestate – Matroska

+0

Можете ли вы поделиться этой частью кода? (Onsaveinstance) – znat

ответ

0

Я думаю, вы используете findViewById() с неправильным видом, который вызывает проблемы.

Вот образец, основанный на том, что вы делаете, что работает для меня.

LinearLayout ll = (LinearLayout)findViewById(R.id.ll); 
ViewGroup parentGroup = parentGroup = (ViewGroup)ll; 

for (int i = 0; i < 3; i++) 
{ 
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.element_list_item, null, true); 
    RatingBar rBar = (RatingBar)view.findViewById(R.id.ratingBar1); 
    rBar.setProgress(i); 
    parentGroup.addView(view); 
} 

Результаты должны отображать три рейтинговых бара с 0, 1 и 2 звездами в зависимости от того, как вы устанавливаете оценочную панель. Я прикладываю новое представление к родительскому представлению три раза. Родитель - это моя линейная раскладка, а новое представление - это балл оценки (или что бы вы ни выбрали).

Для сохранения в виде фрагментов используйте

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    getFragmentManager().putFragment(outState, Content.class.getName(), this); 
} 

, то вы можете получить ваши аргументы в onCreateView и восстановление данных (при необходимости)

Bundle extras = this.getArguments(); 
if(extras != null) 
{ 
    //set arguments here 
} 
Смежные вопросы