Xamarin.Android ViewPager只有ImageViews

时间:2015-03-05 12:52:35

标签: c# android xamarin xamarin.android

我试图让ViewPager只包含ImageView。

但它一直给我这条线上的错误。

((ViewPager)collection).AddView (i);
System.InvalidCastException: Cannot cast from source type to destination type.

这是我的ViewPagerAdapter

public class GalleryAdapter : PagerAdapter
{
    Context context;
    private List<string> mitems;

    public GalleryAdapter (Context c, List<string> items)
    {
        context = c;
        mitems = items;
    }

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

    public override Java.Lang.Object InstantiateItem (View collection, int position)
    {
        ImageView i = new ImageView (context);

        //i.LayoutParameters = new Gallery.LayoutParams (150, 100);
        i.SetScaleType (ImageView.ScaleType.FitCenter);

        Picasso.With (context).Load (mitems [position]).Into (i);
        ((ViewPager)collection).AddView (i);
        return i;
    }

    public override bool IsViewFromObject (View view, Java.Lang.Object @object)
    {
        return view == @object;
    }
}

我不知道从哪里继续。

2 个答案:

答案 0 :(得分:3)

通过Android文档,看起来传递给InstantiateItem的第一个参数只是一个包含您的内容的视图,而不一定是ViewPager本身。事实上,不推荐使用View参数的InstantiateItem版本,而不赞成采用ViewGroup的版本。我不确定Xamarin包装器中是否包含此方法,但在任何一种情况下,请尝试转换为ViewGroup而不是ViewPager:

((ViewGroup)collection).AddView (i);

您可能还想将'collection'变量重命名为'container',只是为了清楚您不是将它直接添加到ViewPager,而是将其添加到ViewPager拥有的子视图中。

答案 1 :(得分:1)

尝试以下

public override Java.Lang.Object InstantiateItem (View collection, int position)
{
    ImageView i = new ImageView (context);

    //i.LayoutParameters = new Gallery.LayoutParams (150, 100);
    i.SetScaleType (ImageView.ScaleType.FitCenter);

    Picasso.With (context).Load (mitems [position]).Into (i);
    var viewPager = collection.JavaCast<ViewPager>();

    viewpager.AddView (i);

    return i;
}