Xamarin.Android ViewPager with only ImageViews



我正在尝试制作一个只包含ImageView的ViewPager。

但在这条线上,它总是给我带来错误。

((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;
    }
}

我不知道该从哪里继续。

查看Android文档,传递给InstantiateItem的第一个参数似乎只是一个包含内容的视图,而不一定是ViewPager本身。事实上,采用View参数的InstantiateItem版本已被弃用,取而代之的是采用ViewGroup的版本。我不确定Xamarin包装器中是否有这个方法,但在任何一种情况下,都可以尝试转换为ViewGroup而不是ViewPager:

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

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

尝试以下

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;
}

最新更新