かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Xamarin AndroidでIListやObservableCollectionをListViewに表示する

先日以下のような記事を書きました。

Xamarin.Android + ReactivePropertyでListViewを使う - かずきのBlog@hatena

別にReactivePropertyのコレクションじゃなくて普通のコレクションを対象にしてかけるじゃないということで、仕立て直してnugetに放流しました。毎回作りそうなコードだったので。

NuGet Gallery | Runceel.XamarinAndroid 1.0.0

使い方

IList>T<とObservableCollection>T<とReadOnlyReactiveCollection>T<にToAdapterという拡張メソッドを定義しています。ObservableCollectionとReadOnlyObservableCollectionから生成されるAdapterはコレクションに変更があったときに自動でNotifyDataSetChangedが呼び出されます。

ToAdapter拡張メソッドの引数は以下のような感じになってます。

  • createRowView: positionと要素から行を表示するためのViewを生成する処理
  • setRowData: positionと要素とViewが渡されるのでViewに値を設定する処理
  • getId: psoitionと要素からidを返す処理(省略した場合はpositionがidになります)

こんな感じで使います。

this.list = new ObservableCollection<string>(); 
this.ListAdapter = this.list.ToAdapter( 
    (_, __) => LayoutInflater.FromContext(this).Inflate(Android.Resource.Layout.SimpleListItem1, null), 
    (_, x, v) => v.FindViewById<TextView>(Android.Resource.Id.Text1).Text = x);