2013-07-23 82 views

回答

2

這當然是可能的。看看GridView,您需要創建一個自定義的Adapter來爲網格中的每個項目加載圖像和標題。

我會這樣想。

創建一個簡單的類來保存關於網格中每個項目的信息。我們稱之爲GridItem

public class GridItem 
{ 
    public string Title { get; set; } 
    public int ImageResourceId { get; set; } 
    public Action ClickAction { get; set; } 
} 

Title是圖片的標題下,ImageResoruceId是資源繪製對象ID在你的項目,即:Resource.Drawable.googleplusClickActionAction被點擊的項目什麼時候做。

現在爲網格中的項目創建佈局。 grid_item.axml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:id="@+id/grid_item_title" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_marginTop="2dp" 
     android:layout_marginBottom="2dp" 
     android:layout_alignParentBottom="true" 
     android:gravity="center_horizontal" 
     android:layout_centerHorizontal="true" /> 
    <ImageView 
     android:id="@+id/grid_item_image" 
     android:layout_above="@+id/grid_item_title" 
     android:layout_height="fill_parent" 
     android:layout_width="fill_parent" /> 
</RelativeLayout> 

現在定製AdapterGridAdapter

public class GridAdapter : BaseAdapter<GridItem> 
{ 
    private readonly IList<GridItem> _items; 
    private readonly Context _context; 

    public GridAdapter(Context context, IList<GridItem> items) 
    { 
     _context = context; 
     _items = items; 
    } 

    public override long GetItemId(int position) 
    { 
     return position; 
    } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     var item = _items[position]; 
     var view = convertView; 
     if (view == null) 
     { 
      var inflater = LayoutInflater.FromContext(_context); 
      view = inflater.Inflate(Resource.Layout.grid_item, parent, false); 
      view.Clickable = true; 
      view.Click += (s, a) => item.ClickAction.Invoke(); 
     } 

     var image = view.FindViewById<ImageView>(Resource.Id.grid_item_image); 
     var title = view.FindViewById<TextView>(Resource.Id.grid_item_title); 

     title.Text = item.Title; 
     image.SetImageResource(item.ImageResourceId); 

     return view; 
    } 

    public override int Count 
    { 
     get { return _items.Count; } 
    } 

    public override GridItem this[int position] 
    { 
     get { return _items[position]; } 
    } 
} 

而對於GridView本身,CustomGridViewDialog.axml佈局。

<GridView 
    android:id="@+id/gridview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="2" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center"/> 

然後創建當你Dialog你會有些代碼是這樣的:

var customView = LayoutInflater.Inflate (Resource.Layout.CustomGridViewDialog, null); 
var items = new List<GridItem> 
{ 
    new GridItem 
    { 
     Title = "Google", 
     ItemResourceId = Resource.Drawable.google, 
     ClickAction =() => { Google(); } 
    }, 
    ... 
}; 
(customView.FindViewById<GridView>(Resource.Id.gridview)).Adapter = new GridAdapter(this, items); 

var builder = new AlertDialog.Builder(this); 
builder.SetTitle("Share"); 
builder.SetView(customView); 

這應該是它。

+0

我無法完成它的工作,我對Xamarin相當陌生,所以也許我做錯了什麼。有沒有一種方法可以創建這樣的解決方案並提供它? –

+0

無法正常工作對您的體驗描述非常糟糕。隨意編輯你的初始文章,你已經嘗試了什麼,出了什麼問題。我沒有時間免費創建整個解決方案。 – Cheesebaron

+0

Cheesebaron,我完全理解,今天我會嘗試更多。然後我會看看我是否可以附上代碼或其他東西。我只是無法得到任何工作。 –