読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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