2013-07-23 78 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,我完全理解,今天我会尝试更多。然后我会看看我是否可以附上代码或其他东西。我只是无法得到任何工作。 –