我的Xamarin Android应用程序为每个视图使用片段而不是单独的活动,其中一个片段需要包含用于照片滑块的ViewPager。
从我看过的所有内容来看,ViewPager必须绑定到使用片段的适配器。这是有问题的,因为这意味着我在片段中有一个片段,它必须使用ChildFragmentManager,Android 4.2之前的版本不支持它。我的应用需要在Android 4.0+上运行,因此我需要有关如何解决此问题的指导。
我有些想法...
有没有办法将其他类型的适配器绑定到不使用片段的ViewPager?在我的情况下,我只需要显示一个ImageView作为每个项目,所以一个片段似乎有点过分,显然有4.2+问题。
除了ViewPager之外我还可以使用其他一些控件,它可以在不依赖子片段的情况下为我提供所需的UX(左/右滑动列表)吗?
有没有办法让ChildFragmentManager与Android 4.0和4.1一起使用?
设置仅支持Android 4.2+的ViewPager的当前代码:
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="200dip"
android:id="@+id/property_details_image_gallery" />
private ViewPager gallery;
gallery = view.FindViewById<ViewPager> (Resource.Id.property_details_image_gallery);
gallery.Adapter = new ImagePagerAdapter (ChildFragmentManager, 0, facts.PhotoUris);
gallery.SetOnPageChangeListener (this);
public class ImagePagerAdapter : FragmentPagerAdapter
{
private int resourceId;
private List<string> photos;
public ImagePagerAdapter (FragmentManager fragmentManager, int resourceId, List<string> photos) : base(fragmentManager)
{
this.resourceId = resourceId;
this.photos = photos;
if (photos.Count == 0)
photos.Add (string.Empty); // If there are no photos, we add a single photo that will result in a 'noimage' photo
}
public override Fragment GetItem (int position)
{
// Instantiate a new fragment
ImageGalleryFragment fragment = new ImageGalleryFragment (photos[position], position);
return fragment;
}
public override long GetItemId (int position)
{
return position;
}
public override int Count {
get {
return photos.Count;
}
}
}
我刚开始使用Xamarin 3天前,所以请保持温和。 :)
答案 0 :(得分:1)
我能够通过让ImagePagerAdapter直接从PagerAdapter继承来实现这一目标。
public class ImagePagerAdapter : PagerAdapter {
private List<string> data;
private Context context;
public ImagePagerAdapter(Context context, List<string> data) {
this.context = context;
this.data = data;
}
public override Java.Lang.Object InstantiateItem(View collection, int position) {
// Create new image view
var uri = data [position];
var imageView = new ImageView(context);
var defaultImage = context.Resources.GetDrawable (Resource.Drawable.noimage);
imageView.SetUrlDrawable (uri, defaultImage);
// Add image view to pager
var viewPager = collection as ViewPager;
viewPager.AddView(imageView);
return imageView;
}
public override void DestroyItem(View collection, int position, Java.Lang.Object view) {
var viewPager = collection as ViewPager;
viewPager.RemoveView(view as View);
}
public override bool IsViewFromObject(View view, Java.Lang.Object obj) {
return view == obj;
}
public override IParcelable SaveState() {
return null;
}
public override void StartUpdate(View arg0) {
}
public override void FinishUpdate(View arg0) {
}
public override int Count {
get {
return data != null ? data.Count : 0;
}
}
}