在Android 4.0和4.1中使用ViewPager / ChildFragmentManager

时间:2014-02-19 17:19:25

标签: android-fragments android-viewpager xamarin.android xamarin

我的Xamarin Android应用程序为每个视图使用片段而不是单独的活动,其中一个片段需要包含用于照片滑块的ViewPager。

从我看过的所有内容来看,ViewPager必须绑定到使用片段的适配器。这是有问题的,因为这意味着我在片段中有一个片段,它必须使用ChildFragmentManager,Android 4.2之前的版本不支持它。我的应用需要在Android 4.0+上运行,因此我需要有关如何解决此问题的指导。

我有些想法...

  1. 有没有办法将其他类型的适配器绑定到不使用片段的ViewPager?在我的情况下,我只需要显示一个ImageView作为每个项目,所以一个片段似乎有点过分,显然有4.2+问题。

  2. 除了ViewPager之外我还可以使用其他一些控件,它可以在不依赖子片段的情况下为我提供所需的UX(左/右滑动列表)吗?

  3. 有没有办法让ChildFragmentManager与Android 4.0和4.1一起使用?

  4. 设置仅支持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天前,所以请保持温和。 :)

1 个答案:

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