3

同じレイアウトで 3 つの行を表示するために、LinearLayout で ListView をシミュレートしようとしています。この単一のビューは、評価バーとコンテンツで構成されています。非常に奇妙ですが、すべての ratingBars は最後に割り当てられた値を受け取ります。まず最初に、これら 2 つのメソッドを追加するだけで 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>

フラグメントの onActivityCreated() 内で setElements メソッドを呼び出します。フラグメントの開始時にはうまく機能しますが、電話を回転させようとすると、アイテムの内容は適切に変更されますが、評価バーは最後の値を取得します (評価 1、2、および 3 の要素が 3 つある場合、すべての評価バーに 3 つの星があります)。 . バグですか?

編集:これは私のonSaveInstanceMethodです:

    @Override
public void onSaveInstanceState(Bundle outState) {

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

    super.onSaveInstanceState(outState);
}

ありがとう

4

2 に答える 2

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 つの 3 つの評価バーが表示されます。新しいビューをビューの親に 3 回アタッチします。親は私の線形レイアウトで、新しいビューは評価バー (または選択したもの) です。

フラグメントで保存する場合

@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
}
于 2012-04-06T16:14:28.710 に答える