Melanjutkan project pada tulisan MVVM Pattern in Xamarin Project using MvvmCross.
Kita buat sebuah class Book di Portable project.
public class Book { public int Id { get; set; } public string Title { get; set; } public string Image { get; set; } public string Author { get; set; } public decimal Price { get; set; } public int Year { get; set; } }
Kemudian kita buat lagi sebuah ViewModel. ViewModel yang digunakan pada ListView harus berisi setidaknya sebuah ObservableCollection. Di konstruktor kita inisialisasi data untuk ObservableCollection Items.
public class BookViewModel : MvxViewModel { public ObservableCollection Items { get; set; } public BookViewModel() { Items = new ObservableCollection(); Items.Add( new Book { Id = 1, Title = "Lord Of The Ring", Author = "JJR. TOLKIEN", Price = 40, Year = 2001, Image = "https://luckty.files.wordpress.com/2012/05/b32.jpg" }); Items.Add( new Book { Id = 2, Title = "The Hobbit", Author = "JJR. TOLKIEN", Price = 35, Year = 2014, Image = "https://images-na.ssl-images-amazon.com/images/I/41aQPTCmeVL._SX331_BO1,204,203,200_.jpg" }); } }
Selanjutanya pada project .Droid (android) kita buat sebuah Layout (.axml), sebagai contoh kita beri nama BookListView.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Mvx.MvxListView android:layout_width="match_parent" android:layout_height="match_parent" local:MvxItemTemplate="@layout/row_layout" local:MvxBind="ItemsSource Items"> </LinearLayout>
Perhatikan local:MvxBind=”ItemsSource Items”, artinya kita melakukan Binding data pada ListView dari property Items pada class Book. Sedangkan untuk menentukan template pada ListView kita gunakan local:MvxItemTemplate.
Pada folder Layout buat sebuah AndroidLayout (.axml) dengan nama row_layout.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="8dp"> <LinearLayout android:id="@+id/Text" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dip"> <TextView android:id="@+id/Text2" android:layout_width="wrap_content" android:layout_height="15.0dp" android:textSize="14dip" android:paddingLeft="100dip" local:MvxBind="Text Title" /> </LinearLayout> <Mvx.MvxImageView android:layout_width="78.0dp" android:layout_height="82.5dp" android:padding="5dip" local:MvxBind="ImageUrl Image" /> </RelativeLayout>
Perhatikan kita melakukan binding Image dengan menggunakan; ItemLongClick ShowInfo”local:MvxBind=”ImageUrl Image” yang artinya ImageUrl pada grid di set dari properti Image pada class Book.
Selanjutnya kita buat sebuah activity yang merupakan turunan dari MvxActivity kemudian pada generic parameternya kita set model yang akan dipanggil yaitu BookViewModel. Jangan lupa set content viewnya dari Layout BookListView.
[Activity(Label = "Book List", MainLauncher = true)] public class BookView : MvxActivity<BookViewModel> { protected override void OnViewModelSet() { base.OnViewModelSet(); SetContentView(Resource.Layout.BookListView); } }
Kita running emulator android kita
Sekarang kita tambahkan event ketika ListView item di click dengan agak lama. Event ini akan memunculkan user dialog alert info tambahan dari Book. Kita tambahkan sebuah ICommand property pada class Book.
public ICommand ShowInfo { get { return new MvxCommand(b => Mvx.Resolve().Alert(GetInfo(b))); } } protected string GetInfo(Book book) { var output = new StringBuilder(); output.Append($"Author: {book.Author}"); output.AppendLine(); output.Append($"Year: {book.Year}"); output.AppendLine(); output.Append($"Price: {book.Price}"); return output.ToString(); }
ShowInfo kita bind sebagai event ketika ListView item click sehingga layout dari BookListView jadi seperti ini.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Mvx.MvxListView android:layout_width="match_parent" android:layout_height="match_parent" local:MvxItemTemplate="@layout/row_layout" local:MvxBind="ItemsSource Items; ItemLongClick ShowInfo" /> </LinearLayout>
Untuk UserDialog kita menggunakan plugin ACR User Dialogs. Install lewat Nuget package manager console.
PM > Install-Package Acr.UserDialogs
Jangan lupa pada class App.cs di .Portable project register instance dari IUserDialog.
Mvx.RegisterSingleton(UserDialogs.Instance);