質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

Xamarin.Android listViewの表示名称と別の情報を裏に持つ方法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 167

Wish_N

score 31

Xamarin.Androidにて開発を行っています。

listViewに項目をバインドする際に、
画面上に表示している項目と押下した際の項目の内容を別に持ちたいと考えています。

イメージとしては下記のような形を想定しています。

[画面上の表示]
りんご
バナナ
みかん

[クリック時の表示]
"りんご"が押された場合は"apple"を表示
"バナナ"が押された場合は"banana"を表示
"みかん"が押された場合は"orange"を表示

現在は実装方法がわからないため、下記のような記載で実装しています

List<string> japList = new List<string>{"りんご","バナナ","みかん"};
List<string> engList = new List<string>{"apple","banana","orange"};

List<string> viewStateItemList = new List<string>();

for(int i = 0;i < japList.counte ; i++)
{
  // ここの処理を解決したい
    viewStateItemList.add(japList + ";" + engList);
}

ArrayAdapter<string> arrayAdapter = new ArrayAdapter<string>(this, Resource.Layout.default, viewStateItemList);

listView.SetAdapter(arrayAdapter);

listView.ItemClick += (s, a) =>
{
    var parent = (ListView)a.Parent;

    string linkeng = (string)parent.GetItemAtPosition(a.Position);
    linkeng= linkeng.Split(";")[1];

    Toast.MakeText(this, linkeng, ToastLength.Short).Show();
};

この実装だと画面上の表示が
[画面上の表示]
りんご;apple
バナナ;banana
みかん;orange

となってしまい、想定の表示と相違します。

ドロップダウンリストのように、ItemとValueという考え方で実装できれば解決できるとは思うのですが、
調べてもよくわかりませんでした。

不足事項等あれば追記します。
どうか、回答お願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

いくつか方法が考えられますが、adapterでクラスを設定するというのはどうでしょうか?クラスにすると、ToStringメソッドの戻り値が表示されることになります。

例えば、このようなクラスです。

public class Fruit : Java.Lang.Object
{
    public string Japanese { get; set; }
    public string English { get; set; }

    public override string ToString()
    {
        return Japanese;
    }
}
List<string> japList = new List<string> { "りんご", "バナナ", "みかん" };
List<string> engList = new List<string> { "apple", "banana", "orange" };

List<Fruit> viewStateItemList = new List<Fruit>();

for (int i = 0; i < japList.Count; i++)
{
    // ここの処理を解決したい
    viewStateItemList.Add(new Fruit
    {
        Japanese = japList[i],
        English = engList[i]
    });
}

ArrayAdapter<Fruit> arrayAdapter = new ArrayAdapter<Fruit>(this, Resource.Layout.default, viewStateItemList);

listView.Adapter = arrayAdapter;

listView.ItemClick += (s, a) =>
{
    var parent = (ListView)a.Parent;

    Fruit linkeng = (Fruit)parent.GetItemAtPosition(a.Position);

    Toast.MakeText(this, linkeng.English, ToastLength.Short).Show();
};

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/11 11:41

    回答いただきありがとうございます。
    無事、お答えいただいた内容で解決いたしました。
    1点質問があるのですが、クラスの作成時に": Java.Lang.Object"を継承しているのは、
    "Fruit linkeng = (Fruit)parent.GetItemAtPosition(a.Position);"の変換のため、という認識で会っていますでしょうか。

    キャンセル

  • 2020/08/11 15:22

    その認識であってます。継承しないと、Java.Lang.Objectにラップされた形で返ってくるのですが、元のクラスにアクセスするのにリフレクションが必要になってしまいます。

    キャンセル

  • 2020/08/12 00:53

    回答ありがとうございます。
    大変わかりやすかったので助かりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る