2012-04-06 19 views
1

Ich versuche, ein ListView in einem LinearLayout zu simulieren, um drei Zeilen mit identischem Layout anzuzeigen. Diese Ansicht besteht aus einer Bewertungsleiste und einem Inhalt. Es ist sehr seltsam, aber alle ratingBars erhalten den letzten zugewiesenen Wert. Zunächst einmal ist dies meine benutzerdefinierte Komponente, die Linearlayout diese beiden Methoden nur das Hinzufügen erweitert:Programmgesteuertes Hinzufügen von Ansicht in ein 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; 
} 

und dieses ist das Layout ich Aufpumpen bin:

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

ich die setElements Methode innerhalb onActivityCreated() aufrufen, in das Fragment. Es funktioniert gut, wenn das Fragment startet, aber wenn ich versuche, das Telefon zu drehen, ändert sich der Inhalt der Elemente richtig, aber die Bewertungsleiste erhält den letzten Wert (wenn es drei Elemente mit der Bewertung 1,2 und 3 gibt, haben alle Bewertungsleisten 3 Sterne) . Ist es ein Fehler?

EDIT: Das ist mein onSaveInstanceMethod:

@Override 
public void onSaveInstanceState(Bundle outState) { 

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

    super.onSaveInstanceState(outState); 
} 

Dank

+0

Wie speichern Sie die Bewertungen wieder herzustellen, wenn die Aktivität getötet ? – znat

+0

Die Bewertungen werden aus dem Netzwerk abgerufen und mithilfe von onsaveinstancestate gespeichert – Matroska

+0

Können Sie diesen Teil des Codes teilen? (onsaveinstance) – znat

Antwort

0

Ich glaube, Sie die findViewById verwenden() mit der falschen Ansicht, die Probleme verursacht.

Hier ist ein Beispiel basierend auf dem, was Sie tun, das für mich funktioniert.

Die Ergebnisse sollten drei Bewertungsbalken mit 0, 1 und 2 Sternen anzeigen, je nachdem, wie Sie die Bewertungsleiste einrichten. Ich füge die neue Ansicht dreimal an die übergeordneten Ansichten an. Das Parent ist mein lineares Layout und die neue Ansicht ist die Bewertungsleiste (oder was auch immer du wählst).

Für in Fragmenten verwenden

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

dann können Sie Ihre Argumente in der onCreateView erhalten und Ihre Daten (falls erforderlich)

Bundle extras = this.getArguments(); 
if(extras != null) 
{ 
    //set arguments here 
} 
Verwandte Themen