Java 如何动态刷新viewpager中的片段?

Java 如何动态刷新viewpager中的片段?,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我的MainActivity中有一个ViewPager(mainViewPager),它从包含另一个ViewPager(imageViewPager)和一个TextView的片段进行渲染。现在,imageViewPager从另一个包含ImageView和按钮的片段进行渲染。我已经在此ImageView上设置了onClick listener,它在下面的按钮下打开图像的全屏视图。现在,一旦单击此button,我希望返回到我的主要活动,条件是位于我输入的同一页面上,并且具有我上次在全屏中查看的同一图

我的MainActivity中有一个ViewPager(mainViewPager),它从包含另一个ViewPager(imageViewPager)和一个TextView的片段进行渲染。现在,imageViewPager从另一个包含ImageView和按钮的片段进行渲染。我已经在此ImageView上设置了onClick listener,它在下面的按钮下打开图像的全屏视图。现在,一旦单击此button,我希望返回到我的主要活动,条件是位于我输入的同一页面上,并且具有我上次在全屏中查看的同一图像。我可以获得相同的页面,但图像始终保持不变从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);
            }
        }

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

}
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("CHANGED_POSITION",changedImgPosition);
                setResult(0,intent);}});
活动\u 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>
TaskFragment.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);
            }
        }

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

}
button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.putExtra("CHANGED_POSITION",changedImgPosition);
                setResult(0,intent);}});
ImageInFullScreen.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);
            }
        }

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

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

//和相同的适配器n all.

在任何需要刷新视图的地方放置以下代码

this.page_position = 0;
imagePagerAdapter.notifyDataSetChanged();
并在ImagePagerAdapter中覆盖以下功能-

@Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
位置\无意味着无论何时调用notifyDataSetChanged,适配器都将创建新视图,而不是使用相同的视图


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

我已经找到了问题的答案,问题是我的setCurrentItem()在TaskFragment的onCreateView()中不起作用,所以我将其移动到Runnable接口的posttime()的Run方法,然后它工作得很好

这是我编辑过的代码

MainActivity.java`

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 0) {

            claim_id = vehicleDetailsArrayList.get(changedPage).getClaimId();

            //Retrieve value of position of last viewed image, before clicking the button
            changedPosition = data.getIntExtra("CHANGED_POSITION", 0);
            Log.i("POSITION 3:"," "+changedPosition);

            if(changedPage > -1 && changedPage < vehicleDetailsArrayList.size()) {
                addUpdateImagePositionInList(claim_id, changedPosition);
            }

            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (mViewPager.getAdapter() != null) {
                        mViewPager.getAdapter().notifyDataSetChanged();
                    }
                }
            }, 0);
        }
    }

    public void addUpdateImagePositionInList(int claimId, int position){
        for (int imageLength = 0; imageLength < imagePositionArrayList.size(); imageLength++)
        {
            if (claimId == (imagePositionArrayList.get(imageLength).getClaim_id()))
            {
                imagePositionArrayList.get(imageLength).setImagePosition(position);
                return;
            }
        }
        imagePositionArrayList.add(new ImagePosition(claimId, position));
    }

    public int getChangedImagePosition(int claimId){
        for (int imageLength = 0; imageLength < imagePositionArrayList.size(); imageLength++)
        {
            if (claimId == (imagePositionArrayList.get(imageLength).getClaim_id()))
            {
                Log.i("POSITION123 ","  ::"+ imagePositionArrayList.get(imageLength).getImagePosition() );
                return imagePositionArrayList.get(imageLength).getImagePosition();
            }
        }
        return 0;
    }
`
@Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

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

        changedImagePosition = ((MainActivity)getActivity()).getChangedImagePosition(id);
        View view = inflater.inflate(R.layout.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);
        imageViewPager.setAdapter(imagePagerAdapter);

        /*The below code doesn't work
        if (imageViewPager.getCurrentItem() != changedImagePosition) {

            Log.i("POSITION current", ":" + imageViewPager.getCurrentItem());
            Log.i("POSITION changed", " :"+ changedImagePosition);

            setCurrentItem = true;
            imageViewPager.setCurrentItem(changedImagePosition, false);
            Log.i("POSITION getCurrent", " :" + imageViewPager.getCurrentItem());
        }
        */


        new Handler().postAtTime(new Runnable() {
            @Override
            public void run() {
                if (imageViewPager.getAdapter() != null) {
                    imageViewPager.getAdapter().notifyDataSetChanged();
                    imageViewPager.setCurrentItem(changedImagePosition);
                }
            }
        },0);

        return view;
    }
`

请帮我对付这些家伙。我是新手。谢谢……我已经试过了,但没用。它不是用上次全屏查看的图像加载imageviewpager,而是用我们单击并进入全屏的图像加载它。谢谢。@Android\u开发者