3

私はアンドロイドの初心者です....あなたの助けが必要です。

私のアプリでは、カスタム アダプターとカスタム行レイアウトを使用してリストビューを作成しました。私はそうすることに成功し、すべての行に1つの画像、テキストビュー、およびスピナーのドロップダウンを追加しました。ドロップダウンには、項目の数があります (たとえば、0 から 9 まで)。

しかし、私の問題は、ドロップダウンを選択して値を設定すると、リストをスクロールすると、スピナーが初期値 (ここでは 0) にリセットされます。

この問題を回避するにはどうすればよいですか? どんな助けでも大歓迎です....よろしくお願いします。

//This is my custom adapter code....

public class MyProductsArrayAdapter extends ArrayAdapter<Products> {
Context context;
int resourceId;

Products data[] = null;

public MyProductsArrayAdapter(Context context, int resourceId,
        Products data[]) {
    super(context, resourceId, data);
    this.context = context;
    this.resourceId = resourceId;

    this.data = data;
}

static class ProductsItemViewHolder {

    ImageView image;
    TextView name;
    Spinner number;
}

String[] mArray = new String[] { "0", "1", "2", "3", "4", "5", "6", "7",

        "8", "9" };

public View getView(final int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    ProductsItemViewHolder holder = null;

    LayoutInflater mInflater = (LayoutInflater) context

            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (rowView == null) {

        rowView = mInflater.inflate(R.layout.main2, parent, false);
        holder = new ProductsItemViewHolder();
        holder.image = (ImageView) rowView.findViewById(R.id.item_icon);

        holder.name = (TextView) rowView.findViewById(R.id.tvListItemText);
        holder.number = (Spinner) rowView.findViewById(R.id.NumberSpinner);

        rowView.setTag(holder);

    } else {


        holder = (ProductsItemViewHolder) rowView.getTag();
    }

    Products f = data[position];
    holder.image.setImageResource(f.itemIcon);
    holder.name.setText(f.itemName);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(context,

            android.R.layout.simple_spinner_item, mArray);

    holder.number.setAdapter(adapter);

    return rowView;

}
}

//そして、ここに私のrow_layoutコードがあります

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="horizontal" >

<ImageView
    android:id="@+id/item_icon"
    android:layout_width="40dp"
    android:layout_height="40dip"

    android:layout_alignParentLeft="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dip"
    android:gravity="center_vertical"

    android:src="@drawable/ic_launcher" >
</ImageView>

<TextView
    android:id="@+id/tvListItemText"
    android:layout_width="wrap_content"

    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_marginLeft="10dp"
    android:layout_toRightOf="@id/item_icon"

    android:maxWidth="180dp"
    android:maxLines="2"
    android:text="Hello testing"
    android:textColor="@color/brown"
    android:textSize="15dp"

    android:typeface="normal" />

<Spinner
    android:id="@+id/NumberSpinner"
    android:layout_width="80dp"
    android:layout_height="wrap_content"

    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginLeft="0dp" />

</RelativeLayout>
4

2 に答える 2

2

リストのgetView()アダプタで、を呼び出す必要がありますYOUR_SPINNER.setSelected(position you set earlier);

これが発生しているのは、リストが作成されると、常にインを取得しconvertViewgetViewスピナーのデフォルトの状態が0の位置にあるため、そこに到達するためです。

また、常にgetViewメソッドでスピナーに対してsetAdapterを実行しているため、これにより、ieが呼び出されるたびに常に初期化さgetView()れます。リストのスクロールについて。

私が言っていることはsetOnItemSelectedListener()あなたspinnerに設定されており、onItemSelected()このリスナーのメソッドで値をスピナーオブジェクトのタグとして設定します。 holder.number.setTag(POSITION)

ステートメントの後holder.number.setAdapter()holder.number.setSelection(Integer.parseInt(number.getTag));

このようにして、選択した値を保存し、getView()が呼び出されるたびに同じインデックスを設定します。

編集済み:

はい、メソッドでパラメータとして取得した値を設定しますonItemSelected(View v, int arg2)。このarg2は、このスピナーに対してこの位置が選択されたことをシステムが通知している位置です(システムによって提供される単純なコールバック)。ここで、同じメソッドの実装で、このコールバックの最初の引数であるこのビューオブジェクトのタグとしてこの値を設定する必要があります。

また、このタグ値をgetView()取得していない場合は、ビューにない行の再利用されたビューが含まれている可能性があるため、convertViewから取得するのではなく、毎回スピナーを初期化する必要があります。

HashTable<integer, integer>また、私が言ったことを実装する際に問題が続く場合は、キーが行のインデックスになり、値が選択されたスピナーアイテムのインデックスになる静的な別のアプローチに従う必要があります。

だから、getViewあなたは設定することができますholder.number.setSelection(hashtable.get(position));

于 2013-01-10T13:43:51.007 に答える
0

「LayoutInflater mInflater;」を宣言します。グローバル変数として。

「mInflater = (LayoutInflater) コンテキスト .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);」を初期化します。コンストラクター内。

于 2013-01-25T10:23:50.373 に答える