You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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执行关闭操作,降低代码耦合:

  1. 定义回调接口
public interface OnExitClickListener
{
    void OnExit();
}
  1. 修改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();
        };
        // 原有代码...
    }
}
  1. 在Swipe Activity中实现接口并传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:13:11