java - 如何动态刷新 viewpager 中的 fragment ?

标签 java android android-fragments android-viewpager

我的 MainActivity 中有一个 ViewPager(mainViewPager),它从包含另一个 ViewPager(imageViewPager) 和一个 TextView 的 fragment 呈现。现在 imageViewPager 从另一个包含 ImageView 和按钮的 fragment 呈现。我已经在此 ImageView 上设置了 onClick 监听器,该监听器通过下面的按钮打开图像的全屏 View 。现在点击此按钮我想返回到我的 MainActivity 条件是在我进入的同一页面上并且与我上次全屏查看的相同图像。我能够获得相同的页面,但图像始终从 0 开始。

基本上我的层次结构是这样的:

MainActivity
   --mainViewPager-->TaskFragment
                        --imageViewPager-->ImageFragment(contains only ImageView
                        --TextView(set text returned from MainActivity)

我的代码: MainActivity.java

    public class MainActivity extends FragmentActivity {

        private ViewPager mViewPager;
        private CustomPagerAdapter mPagerAdapter;
        private int changedPosition;

        private String[] vehicles = new String[]{"Audi Q7", "Honda Accord", "Hyundai i20", "Maruti Suzuki Swift", "Mahindra XUV 500",
                "Swift Dzire", "Honda City", "Honda Civic", "Mercedez Benz", "Rolls Royce", "Ferrari"};

        private String[][] vehicle_info = new String[][]{
                {"http://www.hdwallpapers.in/walls/2010_abt_audi_q7_3_tdi_3-wide.jpg",
                        "http://www.hdwallpapers.in/walls/2010_mtm_audi_s5_cabrio_michelle_edition-wide.jpg",
                        "http://www.hdwallpapers.in/walls/2009_audi_tts_coupe_car-wide.jpg"},
                {"http://automobiles.honda.com/images/2015/accord-sedan/exterior-gallery/2015-honda-accord-sedan-sport-exterior-side1.jpg",
                        "http://www.carprousa.com/wp-content/uploads/2015/01/HondaInterior-e1421978263126.jpg",
                        "http://www.carprousa.com/wp-content/uploads/2015/01/HondaInterior2-e1421978365916.jpg"},
                ...........
};


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            mViewPager = (ViewPager)findViewById(R.id.mainViewPager);
            mPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager(), vehicles, vehicle_info);
            mViewPager.setAdapter(mPagerAdapter);

        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 0) {

                changedPosition = data.getIntExtra("CHANGED_POSITION", 0);
                Log.i("POSITION 3:"," "+changedPosition);

                TaskFragment fragment = new TaskFragment();
                Bundle bundle = new Bundle();
                bundle.putInt("IMAGE_POSITION", changedPosition);
                fragment.setArguments(bundle);
            }
        }

    }

activity_main.xml

 <android.support.v4.view.ViewPager
        android:id="@+id/mainViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

    </android.support.v4.view.ViewPager>

CustomPagerAdapter.java

public class CustomPagerAdapter extends FragmentStatePagerAdapter{

    private String[] vehicles,selected_vehicle_info;
    private String[][] vehicle_info;

    public CustomPagerAdapter(FragmentManager fragmentManager,String[] vehicles,String[][] vehicle_info){
        super(fragmentManager);
        this.vehicles = vehicles;
        this.vehicle_info = vehicle_info;
    }

    @Override
    public Fragment getItem(int position) {

        selected_vehicle_info = vehicle_info[position];

        TaskFragment taskFragment = new TaskFragment();

        Bundle bundle = new Bundle();
        bundle.putString("ITEM",vehicles[position]);
        bundle.putStringArray("ITEM_INFO",selected_vehicle_info);
        taskFragment.setArguments(bundle);

        return taskFragment;
    }

    @Override
    public int getCount() {
        return vehicles.length;
    }
}

TaskFragment.java

public class TaskFragment extends Fragment {

    private String vehicle;
    private String[] vehicle_info;
    private ViewPager imageViewPager;
    private ImagePagerAdapter imagePagerAdapter;
    private int changedImagePosition;


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        vehicle = getArguments().getString("ITEM");
        vehicle_info = getArguments().getStringArray("ITEM_INFO");

        View view = inflater.inflate(R.layout.activity_task_fragment,container,false);
        TextView messageTextView = (TextView) view.findViewById(R.id.textView);
        messageTextView.setText(vehicle);

        imageViewPager = (ViewPager)view.findViewById(R.id.imageViewPager);

        imagePagerAdapter = new ImagePagerAdapter(getActivity(), vehicle_info);
        imagePagerAdapter.notifyDataSetChanged();
        imageViewPager.setAdapter(imagePagerAdapter);
        imageViewPager.setCurrentItem(changedImagePosition);

        return view;
    }

    private class ImagePagerAdapter extends PagerAdapter {

        private Activity activity;
        private String[] vehicle_info;

        public ImagePagerAdapter(Activity activity,String[] vehicle_info){
            this.activity = activity;
            this.vehicle_info = vehicle_info;
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {

            LayoutInflater inflater = LayoutInflater.from(activity);
            View view = inflater.inflate(R.layout.activity_image_fragment,container,false);
            ImageView imageView = (ImageView) view.findViewById(R.id.imageView);

            Picasso.with(getContext()).load(vehicle_info[position]).into(imageView);

            if(imageView.getParent()!=null)
                ((ViewGroup)imageView.getParent()).removeView(imageView);

            ((ViewPager) container).addView(imageView, 0);

            imageView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(activity, ImageInFullScreen.class);
                    intent.putExtra("IMAGES_URL", vehicle_info);
                    intent.putExtra("IMAGE_POSITION", position);
                    activity.startActivityForResult(intent, 0);
                }
            });
            return imageView;
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }

        @Override
        public int getCount() {
            return vehicle_info.length;
        }

        @Override
        public void destroyItem(ViewGroup collection, int position, Object view) {
            collection.removeView((View) view);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    }

}

ImageInFullScreen.java

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("CHANGED_POSITION",changedImgPosition);
                setResult(0,intent);}});

//所有的都是同一个适配器。

最佳答案

在你想刷新 View 的地方放置下面的代码

this.page_position = 0;
imagePagerAdapter.notifyDataSetChanged();

并在您的 ImagePagerAdapter 中覆盖以下函数 -

@Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

POSITION_NONE 表示无论何时调用 notifyDataSetChanged,适配器都会创建新 View 而不是使用相同的 View 。

这应该适用于我们的情况。

关于java - 如何动态刷新 viewpager 中的 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35035613/

相关文章:

java - Izpack 安装程序 - 更改窗口标题和页脚

java - 使用 Thrift 进行离线序列化?

java - 如何通过连接到 JSP 的 servlet 插入带有 auto_increment 外键的 MySQL 表

java - 如何启动 aicas license provider ?并使用 jamaicaVM 调用文件?

java - Android Studio - 获取数字而不是 HTML 内容

android - 从 Button onClick 获取 TextView 的值并通过 TextWatcher 将值传递给 TextView

android - 我应该将 Ionic Platforms 文件夹放入源代码管理吗?

android - 调用从 Android/Java 返回值的 Unity C# 方法

java - 如何以编程方式从 Android 中的 DatePicker/TimePicker Spinner 中提取值?

安卓ViewPager : Child Button prevents scroll