かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

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);