Langkah 1
Buatlah sebuah project dengan nama ListViewGambar pada Xamarin anda.
Langkah 2
Untuk membuat CardView kita harus menginstal Components antara lain adalah :
- Android Support Library v7 RecyclerView
- Android Support Library v7 CardView
- Android Support Design Library
Langkah 3
Masukan gambar foto ini ke dalam folder Drawable, kalian bisa mendownload fotonya di sini, kemudia masukan ke folder drawable.
Langkah 4
Buka file Main.axml pada folder layout lalu ubah dengan code sebagai berikut
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/randPickButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Random Pick" /> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:scrollbars="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout>
Langkah 5
Buatlah sebuah Layout baru dengan nama PhotoCardView.axml dengan code sebagai berikut
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:card_view="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" card_view:cardElevation="4dp" card_view:cardUseCompatPadding="true" card_view:cardCornerRadius="5dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="8dp"> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/imageView" android:scaleType="centerCrop" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#ffbdbdbd" android:text="Caption" android:id="@+id/textView" android:layout_gravity="center_horizontal" android:layout_marginLeft="4dp" android:textStyle="bold" /> </LinearLayout> </android.support.v7.widget.CardView> </FrameLayout>
Langkah 6
Buatlah sebuah class baru dengan nama PhotoAlbum.cs lalu masukan code berikut
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Support.V7.Widget; using System.Collections.Generic; namespace ListViewGambar { // Photo: contains image resource ID and caption: public class Photo { // Photo ID for this photo: public int mPhotoID; // Caption text for this photo: public string mCaption; // Return the ID of the photo: public int PhotoID { get { return mPhotoID; } } // Return the Caption of the photo: public string Caption { get { return mCaption; } } } // Photo album: holds image resource IDs and caption: public class PhotoAlbum { // Built-in photo collection - this could be replaced with // a photo database: static Photo[] mBuiltInPhotos = { new Photo { mPhotoID = Resource.Drawable.buckingham_guards, mCaption = "Buckingham Palace" }, new Photo { mPhotoID = Resource.Drawable.la_tour_eiffel, mCaption = "The Eiffel Tower" }, new Photo { mPhotoID = Resource.Drawable.louvre_1, mCaption = "The Louvre" }, new Photo { mPhotoID = Resource.Drawable.before_mobile_phones, mCaption = "Before mobile phones" }, new Photo { mPhotoID = Resource.Drawable.big_ben_1, mCaption = "Big Ben skyline" }, new Photo { mPhotoID = Resource.Drawable.big_ben_2, mCaption = "Big Ben from below" }, new Photo { mPhotoID = Resource.Drawable.london_eye, mCaption = "The London Eye" }, new Photo { mPhotoID = Resource.Drawable.eurostar, mCaption = "Eurostar Train" }, new Photo { mPhotoID = Resource.Drawable.arc_de_triomphe, mCaption = "Arc de Triomphe" }, new Photo { mPhotoID = Resource.Drawable.louvre_2, mCaption = "Inside the Louvre" }, new Photo { mPhotoID = Resource.Drawable.versailles_fountains, mCaption = "Versailles fountains" }, new Photo { mPhotoID = Resource.Drawable.modest_accomodations, mCaption = "Modest accomodations" }, new Photo { mPhotoID = Resource.Drawable.notre_dame, mCaption = "Notre Dame" }, new Photo { mPhotoID = Resource.Drawable.inside_notre_dame, mCaption = "Inside Notre Dame" }, new Photo { mPhotoID = Resource.Drawable.seine_river, mCaption = "The Seine" }, new Photo { mPhotoID = Resource.Drawable.rue_cler, mCaption = "Rue Cler" }, new Photo { mPhotoID = Resource.Drawable.champ_elysees, mCaption = "The Avenue des Champs-Elysees" }, new Photo { mPhotoID = Resource.Drawable.seine_barge, mCaption = "Seine barge" }, new Photo { mPhotoID = Resource.Drawable.versailles_gates, mCaption = "Gates of Versailles" }, new Photo { mPhotoID = Resource.Drawable.edinburgh_castle_2, mCaption = "Edinburgh Castle" }, new Photo { mPhotoID = Resource.Drawable.edinburgh_castle_1, mCaption = "Edinburgh Castle up close" }, new Photo { mPhotoID = Resource.Drawable.old_meets_new, mCaption = "Old meets new" }, new Photo { mPhotoID = Resource.Drawable.edinburgh_from_on_high, mCaption = "Edinburgh from on high" }, new Photo { mPhotoID = Resource.Drawable.edinburgh_station, mCaption = "Edinburgh station" }, new Photo { mPhotoID = Resource.Drawable.scott_monument, mCaption = "Scott Monument" }, new Photo { mPhotoID = Resource.Drawable.view_from_holyrood_park, mCaption = "View from Holyrood Park" }, new Photo { mPhotoID = Resource.Drawable.tower_of_london, mCaption = "Outside the Tower of London" }, new Photo { mPhotoID = Resource.Drawable.tower_visitors, mCaption = "Tower of London visitors" }, new Photo { mPhotoID = Resource.Drawable.one_o_clock_gun, mCaption = "One O'Clock Gun" }, new Photo { mPhotoID = Resource.Drawable.victoria_albert, mCaption = "Victoria and Albert Museum" }, new Photo { mPhotoID = Resource.Drawable.royal_mile, mCaption = "The Royal Mile" }, new Photo { mPhotoID = Resource.Drawable.museum_and_castle, mCaption = "Edinburgh Museum and Castle" }, new Photo { mPhotoID = Resource.Drawable.portcullis_gate, mCaption = "Portcullis Gate" }, new Photo { mPhotoID = Resource.Drawable.to_notre_dame, mCaption = "Left or right?" }, new Photo { mPhotoID = Resource.Drawable.pompidou_centre, mCaption = "Pompidou Centre" }, new Photo { mPhotoID = Resource.Drawable.heres_lookin_at_ya, mCaption = "Here's Lookin' at Ya!" }, }; // Array of photos that make up the album: private Photo[] mPhotos; // Random number generator for shuffling the photos: Random mRandom; // Create an instance copy of the built-in photo list and // create the random number generator: public PhotoAlbum() { mPhotos = mBuiltInPhotos; mRandom = new Random(); } // Return the number of photos in the photo album: public int NumPhotos { get { return mPhotos.Length; } } // Indexer (read only) for accessing a photo: public Photo this[int i] { get { return mPhotos[i]; } } // Pick a random photo and swap it with the top: public int RandomSwap() { // Save the photo at the top: Photo tmpPhoto = mPhotos[0]; // Generate a next random index between 1 and // Length (noninclusive): int rnd = mRandom.Next(1, mPhotos.Length); // Exchange top photo with randomly-chosen photo: mPhotos[0] = mPhotos[rnd]; mPhotos[rnd] = tmpPhoto; // Return the index of which photo was swapped with the top: return rnd; } // Shuffle the order of the photos: public void Shuffle() { // Use the Fisher-Yates shuffle algorithm: for (int idx = 0; idx < mPhotos.Length; ++idx) { // Save the photo at idx: Photo tmpPhoto = mPhotos[idx]; // Generate a next random index between idx (inclusive) and // Length (noninclusive): int rnd = mRandom.Next(idx, mPhotos.Length); // Exchange photo at idx with randomly-chosen (later) photo: mPhotos[idx] = mPhotos[rnd]; mPhotos[rnd] = tmpPhoto; } } } }
Langkah 7
Buatlah sebuah class ViewHolder dengan nama PhotoViewHolder.cs dengan code sebagai berikut
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Support.V7.Widget; using System.Collections.Generic; namespace ListViewGambar { //---------------------------------------------------------------------- // VIEW HOLDER // Implement the ViewHolder pattern: each ViewHolder holds references // to the UI components (ImageView and TextView) within the CardView // that is displayed in a row of the RecyclerView: public class PhotoViewHolder : RecyclerView.ViewHolder { public ImageView Image { get; private set; } public TextView Caption { get; private set; } // Get references to the views defined in the CardView layout. public PhotoViewHolder(View itemView, Actionlistener): base(itemView) { // Locate and cache view references: Image = itemView.FindViewById (Resource.Id.imageView); Caption = itemView.FindViewById (Resource.Id.textView); // Detect user clicks on the item view and report which item // was clicked (by position) to the listener: itemView.Click += (sender, e) => listener(base.Position); } } }
Langkah 8
Buatlah sebuah class Adapter dengan nama PhotoAlbumAdapter.cs dengan code sebagai berikut
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Support.V7.Widget; using System.Collections.Generic; namespace ListViewGambar { //---------------------------------------------------------------------- // ADAPTER // Adapter to connect the data set (photo album) to the RecyclerView: public class PhotoAlbumAdapter : RecyclerView.Adapter { // Event handler for item clicks: public event EventHandlerItemClick; // Underlying data set (a photo album): public PhotoAlbum mPhotoAlbum; // Load the adapter with the data set (photo album) at construction time: public PhotoAlbumAdapter(PhotoAlbum photoAlbum) { mPhotoAlbum = photoAlbum; } // Create a new photo CardView (invoked by the layout manager): public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { // Inflate the CardView for the photo: View itemView = LayoutInflater.From(parent.Context). Inflate(Resource.Layout.PhotoCardView, parent, false); // Create a ViewHolder to find and hold these view references, and // register OnClick with the view holder: PhotoViewHolder vh = new PhotoViewHolder(itemView, OnClick); return vh; } // Fill in the contents of the photo card (invoked by the layout manager): public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { PhotoViewHolder vh = holder as PhotoViewHolder; // Set the ImageView and TextView in this ViewHolder's CardView // from this position in the photo album: vh.Image.SetImageResource(mPhotoAlbum[position].PhotoID); vh.Caption.Text = mPhotoAlbum[position].Caption; } // Return the number of photos available in the photo album: public override int ItemCount { get { return mPhotoAlbum.NumPhotos; } } // Raise an event when the item-click takes place: void OnClick(int position) { if (ItemClick != null) ItemClick(this, position); } } }
Langkah 9
Bukalah file MainActivity.cs dan modifikasi code sebagai berikut
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Widget; using Android.OS; using Android.Support.V7.Widget; using System.Collections.Generic; namespace ListViewGambar { [Activity(Label = "RecyclerViewer", MainLauncher = true ,Theme = "@android:style/Theme.Material.Light.DarkActionBar")] public class MainActivity : Activity { // RecyclerView instance that displays the photo album: RecyclerView mRecyclerView; // Layout manager that lays out each card in the RecyclerView: RecyclerView.LayoutManager mLayoutManager; // Adapter that accesses the data set (a photo album): PhotoAlbumAdapter mAdapter; // Photo album that is managed by the adapter: PhotoAlbum mPhotoAlbum; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Instantiate the photo album: mPhotoAlbum = new PhotoAlbum(); // Set our view from the "main" layout resource: SetContentView(Resource.Layout.Main); // Get our RecyclerView layout: mRecyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView); //............................................................ // Layout Manager Setup: // Use the built-in linear layout manager: mLayoutManager = new LinearLayoutManager(this); // Or use the built-in grid layout manager (two horizontal rows): // mLayoutManager = new GridLayoutManager // (this, 2, GridLayoutManager.Horizontal, false); // Plug the layout manager into the RecyclerView: mRecyclerView.SetLayoutManager(mLayoutManager); //............................................................ // Adapter Setup: // Create an adapter for the RecyclerView, and pass it the // data set (the photo album) to manage: mAdapter = new PhotoAlbumAdapter(mPhotoAlbum); // Register the item click handler (below) with the adapter: mAdapter.ItemClick += OnItemClick; // Plug the adapter into the RecyclerView: mRecyclerView.SetAdapter(mAdapter); //............................................................ // Random Pick Button: // Get the button for randomly swapping a photo: Button randomPickBtn = FindViewById<Button>(Resource.Id.randPickButton); // Handler for the Random Pick Button: randomPickBtn.Click += delegate { if (mPhotoAlbum != null) { // Randomly swap a photo with the top: int idx = mPhotoAlbum.RandomSwap(); // Update the RecyclerView by notifying the adapter: // Notify that the top and a randomly-chosen photo has changed (swapped): mAdapter.NotifyItemChanged(0); mAdapter.NotifyItemChanged(idx); } }; } // Handler for the item click event: void OnItemClick(object sender, int position) { // Display a toast that briefly shows the enumeration of the selected photo: int photoNum = position + 1; Toast.MakeText(this, "This is photo number " + photoNum, ToastLength.Short).Show(); } } }
Salam
Terimakasih
No comments:
Post a Comment
Mohon melakukan komentar dengan bahasa yang mudah dipahami, santun dan dengan bahasa yang baik.