0

スピナー コントロールの調査を開始しました。私が望んでいたことはほぼ達成しましたが、最後のステップだけが欠けています。これが私がこれまでに行ったことです。

この例には非常に単純なクラスがあります。

[Serializable]
public class Merchant
{
    public Int64 MerchantId { get; set; }
    public String ShopName { get; set; }

    public override string ToString()
    {
        return ShopName;
    }
}

Spinner を配置した axml は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="1280dip"
    android:layout_height="800dip">
    <TextView
        android:text="Select a merchant:"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lblSelect"
        android:layout_marginLeft="30dip"
        android:layout_marginTop="30dip"
        android:textSize="42dip" />
    <Spinner
        android:id="@+id/spinMerchant"
        android:layout_width="1000dip"
        android:layout_height="wrap_content"
        android:layout_below="@id/lblSelect"
        android:prompt="@string/spinner_prompt"
        android:layout_centerHorizontal="true"
        android:minHeight="20dip" />
</RelativeLayout>

そして私のコードは次のとおりです。

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        // Create your application here
        this.SetContentView(Resource.Layout.MerchantSelect);

        List<Merchant> lstMerchant = new List<Merchant> ();
        lstMerchant.Add (new Merchant() { ShopName = "First Shop", MerchantId = 11 });
        lstMerchant.Add (new Merchant() { ShopName = "Second Shop", MerchantId = 12 });

        Spinner spinner = this.FindViewById<Spinner>(Resource.Id.spinMerchant);
        ArrayAdapter adapter = new ArrayAdapter (this, Android.Resource.Layout.SimpleSpinnerItem, lstMerchant);
        spinner.ItemSelected += new EventHandler<AdapterView.ItemSelectedEventArgs> (spinner_ItemSelected);

        spinner.Adapter = adapter;
    }

    private void spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
    {
        Spinner spinner = (Spinner)sender;
        //Merchant merch = (Merchant)spinner.SelectedItem;
        string toast = string.Format ("Selected text is {0}", spinner.GetItemAtPosition (e.Position));
        Toast.MakeText (this, toast, ToastLength.Long).Show ();
    }

選択が行われるとすぐに、選択したテキストとその背後にある ID を取得したいと考えています。私はテキストを手に入れましたspinner.GetItemAtPosition (e.Position)が、私にIDを与えることができるものを見つけることができないようです. 私がやろうとするとMerchant merch = (Merchant)spinner.SelectedItem;、例外が発生します: Cannot convert type 'Java.Lang.Object' to 'Merchant'.

どうすれば達成できるか教えてください。

ありがとう。

4

1 に答える 1

0

スピナーはテキストについてのみ知っています。これは、ToString()メソッドにあるものだからです。Merchantスピナー データを提供しているアダプターは、オブジェクトを扱っていることを認識していません。実際の Merchant オブジェクトにアクセスするにList<Merchant> lstMerchantは、クラスのメンバーにする必要があります。

次に、選択ハンドラーを変更します。

private void spinner_ItemSelected (object sender, AdapterView.ItemSelectedEventArgs e)
    {
        Spinner spinner = (Spinner)sender;
       // Get the ID from your model.
        Merchant merch = this.lstMerchant[e.Position];
        var id = merch.MerchantId;
        string toast = string.Format ("Selected text is {0}", spinner.GetItemAtPosition (e.Position));
        Toast.MakeText (this, toast, ToastLength.Long).Show ();
    }
于 2013-08-28T11:09:28.520 に答える