如何在Android ViewPager的Adapter中关闭ViewPager并返回父视图?
问题描述
我已经完成Android ViewPager的配置并正常运行,当用户浏览完图片和数据后,需要关闭该ViewPager所在的页面并返回父视图。我在ViewPager包含的子视图中添加了一个按钮,点击按钮会执行Adapter中的代码,但找不到关闭ViewPager的方法。我的Adapter代码如下:
public class ImageSliderAdapter : PagerAdapter { Context _context; DataSet _MyImages = new DataSet(); public ImageSliderAdapter(Context context, DataSet MyImages) { _MyImages = MyImages; _context = context; } public override bool IsViewFromObject(Android.Views.View view, Java.Lang.Object @object) { return view == ((LinearLayout)@object); } public override int Count { get { return _MyImages.Tables[0].Rows.Count; } } public override void DestroyItem(ViewGroup container, int position, Java.Lang.Object objectValue) { } public override Java.Lang.Object InstantiateItem(ViewGroup container, int position) { View view = container; var inflater = _context.GetSystemService(Context.LayoutInflaterService) as LayoutInflater; view = inflater.Inflate(Resource.Layout.image_slider_item, null); var child = view.FindViewById<ImageView>(Resource.Id.image_slider_item); child.SetScaleType(ImageView.ScaleType.CenterCrop); TextView Name = view.FindViewById<TextView>(Resource.Id.Name); TextView CellPhone = view.FindViewById<TextView>(Resource.Id.CellPhone); TextView HomePhone = view.FindViewById<TextView>(Resource.Id.HomePhone); Button MyExit = view.FindViewById<Button>(Resource.Id.button_Exit); MyExit.Click += (o, e) => { // need to exit here/ }; Bitmap image = null; string Name = ""; string HomePhoneNumber = ""; string CellPhoneNumber = ""; Task.Run(() => { //URL url = new URL(_imageUrls[position]); byte[] MyPhoto = (byte[])_MyImages.Tables[0].Rows[position]["photo"]; image = BitmapFactory.DecodeByteArray(MyPhoto, 0, MyPhoto.Length); //(Bitmap)_MyImages.Tables[0].Rows[position]["Photo"]; //BitmapFactory.DecodeStream(url.OpenConnection().InputStream); Name = _MyImages.Tables[0].Rows[position]["name"].ToString(); HomePhoneNumber = _MyImages.Tables[0].Rows[position]["HomePhoneNumber"].ToString(); CellPhoneNumber = _MyImages.Tables[0].Rows[position]["CellPhoneNumber"].ToString(); }).ContinueWith(t => { (_context as Swipe).RunOnUiThread(() => { child.SetImageBitmap(image); Name.Text = Name; Home.Text = HomePhoneNumber; Away.Text = CellPhoneNumber; }); }); container.AddView(view); return view; } }
请问如何关闭该ViewPager并返回父视图?
解决方案
方法1:通过上下文强转Activity快速实现
从你的代码能看到,_context实际是承载ViewPager的Swipe Activity,直接在按钮点击事件里调用Activity的Finish()方法即可关闭当前页面返回父视图:
MyExit.Click += (o, e) => { // 关闭当前Activity,返回父视图 (_context as Swipe)?.Finish(); };
这种方式简单直接,但缺点是Adapter和Activity耦合度高,后续如果Activity类名变更或上下文类型改变会出错。
方法2:接口回调解耦(推荐)
定义回调接口让Activity实现,Adapter通过接口通知Activity执行关闭操作,降低代码耦合:
- 定义回调接口
public interface OnExitClickListener { void OnExit(); }
- 修改Adapter构造函数,传入接口实例
public class ImageSliderAdapter : PagerAdapter { Context _context; DataSet _MyImages = new DataSet(); private OnExitClickListener _exitListener; // 新增回调参数 public ImageSliderAdapter(Context context, DataSet MyImages, OnExitClickListener exitListener) { _MyImages = MyImages; _context = context; _exitListener = exitListener; } // 原有代码不变... public override Java.Lang.Object InstantiateItem(ViewGroup container, int position) { // 原有代码... Button MyExit = view.FindViewById<Button>(Resource.Id.button_Exit); MyExit.Click += (o, e) => { // 通过接口通知Activity关闭 _exitListener?.OnExit(); }; // 原有代码... } }
- 在
SwipeActivity中实现接口并传入Adapter
public class Swipe : Activity, OnExitClickListener { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 初始化ViewPager和Adapter ViewPager viewPager = FindViewById<ViewPager>(Resource.Id.your_viewpager_id); ImageSliderAdapter adapter = new ImageSliderAdapter(this, yourDataSet, this); viewPager.Adapter = adapter; } // 实现接口方法 public void OnExit() { Finish(); // 关闭当前Activity返回父视图 } }
这种方式让Adapter和Activity解耦,代码更易维护,适合长期项目。
内容的提问来源于stack exchange,提问作者Prescott Chartier
相关产品推荐
相关产品推荐

