2012-04-06 136 views
1

我試圖在LinearLayout中模擬ListView以顯示具有相同佈局的三行。此單一視圖由評分欄和內容組成。這很奇怪,但是所有的ratingBars都會收到最後一次分配的值。首先,這是一個擴展的LinearLayout只需添加這兩種方法我的自定義組件:在以編程方式將視圖添加到LinearLayout中

<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> 

我稱之爲內onActivityCreated的setElements()方法:

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; 
} 

,這是我膨脹的佈局片段。它在片段開始時運行良好,但是當我嘗試旋轉手機時,項目內容會正確更改,但評分欄會獲取最後一個值(如果有3個評分爲1,2和3的元素,所有評分欄都爲3星) 。這是一個錯誤嗎?

編輯:這是我的onSaveInstanceMethod:

@Override 
public void onSaveInstanceState(Bundle outState) { 

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

    super.onSaveInstanceState(outState); 
} 

感謝

+0

你如何挽救收視率,當活動被殺害? – znat 2012-04-06 15:27:47

+0

評分從網絡中檢索並使用onsaveinstancestate保存 – Matroska 2012-04-06 15:42:49

+0

你能分享那部分代碼嗎? (onsaveinstance) – znat 2012-04-06 16:06:39

回答

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 
} 
相關問題