使用ViewPager一屏加载多张图片,图片重叠问题

本文介绍如何使用ViewPager展示每屏三张图片,并实现下拉刷新功能。文章详细解释了重写getPageWidth和getItemPosition方法的原因及步骤,同时分享了解决图片重叠问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:

使用Viewpager显示图片,每一屏显示3张图片,下拉刷新需要刷新图片

实现:

重写getpageWidth方法,return 1.0f/3即可,重写getItemPosition方法返回POSITION_NONE以实现下拉刷新。

存在问题(需要满足一系列条件才会出现):

会出现图片重叠问题;
这里写图片描述

步骤分析:

  1. 使用List 传递需要显示的View,使用List传递需要的图片URl,为了模拟刷新,使用了两个Url的list

    private List<String> url1 = new ArrayList<String>() {{
            add("http://img0.imgtn.bdimg.com/it/u=1767109513,505165385&fm=27&gp=0.jpg");
            add("http://img2.imgtn.bdimg.com/it/u=3721213387,3527941751&fm=27&gp=0.jpg");
            add("http://img1.imgtn.bdimg.com/it/u=1092319242,1669521439&fm=27&gp=0.jpg");
            add("http://img0.imgtn.bdimg.com/it/u=2244342679,3473440563&fm=27&gp=0.jpg");
            add("http://img3.imgtn.bdimg.com/it/u=2226396175,2886745608&fm=200&gp=0.jpg");
            add("http://img4.imgtn.bdimg.com/it/u=786606732,3918934292&fm=200&gp=0.jpg");
            add("http://img1.imgtn.bdimg.com/it/u=3405902385,207740320&fm=200&gp=0.jpg");
        }};
    
        private List<String> url2 = new ArrayList<String>() {{
            add("http://img1.imgtn.bdimg.com/it/u=3013460182,2306048797&fm=200&gp=0.jpg");
            add("http://img0.imgtn.bdimg.com/it/u=451958898,471147024&fm=200&gp=0.jpg");
            add("http://img5.imgtn.bdimg.com/it/u=4054007864,2464688467&fm=27&gp=0.jpg");
            add("http://img2.imgtn.bdimg.com/it/u=418233788,3768880590&fm=200&gp=0.jpg");
            add("http://img3.imgtn.bdimg.com/it/u=3559536831,2045373112&fm=200&gp=0.jpg");
            add("http://img5.imgtn.bdimg.com/it/u=2992442341,2383003136&fm=27&gp=0.jpg");
            add("http://img3.imgtn.bdimg.com/it/u=3848981340,893455915&fm=200&gp=0.jpg");
        }};
        private List<String> data;
        private List<View> views;
  2. 建立Adapter:因为一屏幕显示3个,需要重写getPageWidth,因为需要刷新,重写getItemPosition (因为ViewPage的notifyDataSetChanged()方法只有在增加一页数据或者减少一页数据时,才会判定刷新,重写getItemPosition并return POSITION_NONE, 则每次都会重建);

    public class IndicatorPagerAdapter extends PagerAdapter {
    
    
            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }
    
            @Override
            public int getCount() {
                return views.size();
            }
    
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                ImageView imageView = views.get(position).findViewById(R.id.imageView);
                Glide.with(imageView.getContext()).load(data.get(position)).into(imageView);
                container.addView(views.get(position));
                return views.get(position);
            }
    
            @Override
            public int getItemPosition(Object object) {
                return POSITION_NONE;
            }
    
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView(views.get(position));
            }
    
            @Override
            public float getPageWidth(int position) {
                return 1.0f / 3;
            }
        }
  3. 通过加入SwipeRefreshLayout,达到刷新效果。

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_view_pager);
    
            viewPager = (ViewPager) findViewById(R.id.viewPager);
            data = new LinkedList<>();
            views = new LinkedList<>();
            indicatorPagerAdapter = new IndicatorPagerAdapter();
    
            viewPager.setAdapter(indicatorPagerAdapter);
    
            swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
            swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    if (flag) {
                        data.clear();
                        data.addAll(url1);
                        createView(url1);
                        flag = !flag;
                    } else {
                        data.clear();
                        data.addAll(url2);
                        createView(url2);
                        flag = !flag;
                    }
                    swipeRefresh.setRefreshing(false);
                    indicatorPagerAdapter.notifyDataSetChanged();
                }
            });
        }
    
        boolean flag = false;
    
        private void createView(List data) {
            views.clear();
            for (int i = 0; i < data.size(); i++) {
                View inflate = LayoutInflater.from(ViewPagerActivity.this).inflate(R.layout.item_view_pager_image, null);
                views.add(inflate);
            }
        }
    

分析原因:

做过了2个操作:

  1. 重写了getItemPosition
  2. 重写了getPageWidth

最后解决方案:

发现一个细节点:distroyItem方法的方法体,直接container.remove(views.get(position)),只需改为containenr.remove((View) object)即可。

完整源码(注,文中传递View的方式个人认为不是最佳,谨慎模仿)

public class ViewPagerActivity extends AppCompatActivity {

    private ViewPager viewPager;

    private SwipeRefreshLayout swipeRefresh;

    private List<String> url1 = new ArrayList<String>() {{
        add("http://img0.imgtn.bdimg.com/it/u=1767109513,505165385&fm=27&gp=0.jpg");
        add("http://img2.imgtn.bdimg.com/it/u=3721213387,3527941751&fm=27&gp=0.jpg");
        add("http://img1.imgtn.bdimg.com/it/u=1092319242,1669521439&fm=27&gp=0.jpg");
        add("http://img0.imgtn.bdimg.com/it/u=2244342679,3473440563&fm=27&gp=0.jpg");
        add("http://img3.imgtn.bdimg.com/it/u=2226396175,2886745608&fm=200&gp=0.jpg");
        add("http://img4.imgtn.bdimg.com/it/u=786606732,3918934292&fm=200&gp=0.jpg");
        add("http://img1.imgtn.bdimg.com/it/u=3405902385,207740320&fm=200&gp=0.jpg");
    }};

    private List<String> url2 = new ArrayList<String>() {{
        add("http://img1.imgtn.bdimg.com/it/u=3013460182,2306048797&fm=200&gp=0.jpg");
        add("http://img0.imgtn.bdimg.com/it/u=451958898,471147024&fm=200&gp=0.jpg");
        add("http://img5.imgtn.bdimg.com/it/u=4054007864,2464688467&fm=27&gp=0.jpg");
        add("http://img2.imgtn.bdimg.com/it/u=418233788,3768880590&fm=200&gp=0.jpg");
        add("http://img3.imgtn.bdimg.com/it/u=3559536831,2045373112&fm=200&gp=0.jpg");
        add("http://img5.imgtn.bdimg.com/it/u=2992442341,2383003136&fm=27&gp=0.jpg");
        add("http://img3.imgtn.bdimg.com/it/u=3848981340,893455915&fm=200&gp=0.jpg");
    }};
    private List<String> data;
    private List<View> views;

    IndicatorPagerAdapter indicatorPagerAdapter;

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

        viewPager = (ViewPager) findViewById(R.id.viewPager);
        data = new LinkedList<>();
        views = new LinkedList<>();
        indicatorPagerAdapter = new IndicatorPagerAdapter();

        viewPager.setAdapter(indicatorPagerAdapter);

        swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);
        swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if (flag) {
                    data.clear();
                    data.addAll(url1);
                    createView(url1);
                    flag = !flag;
                } else {
                    data.clear();
                    data.addAll(url2);
                    createView(url2);
                    flag = !flag;
                }
                swipeRefresh.setRefreshing(false);
                indicatorPagerAdapter.notifyDataSetChanged();
            }
        });
    }

    boolean flag = false;

    private void createView(List data) {
        views.clear();
        for (int i = 0; i < data.size(); i++) {
            View inflate = LayoutInflater.from(ViewPagerActivity.this).inflate(R.layout.item_view_pager_image, null);
            views.add(inflate);
        }
    }

    public class IndicatorPagerAdapter extends PagerAdapter {


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

        @Override
        public int getCount() {
            return views.size();
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            ImageView imageView = views.get(position).findViewById(R.id.imageView);
            Glide.with(imageView.getContext()).load(data.get(position)).into(imageView);
            container.addView(views.get(position));
            return views.get(position);
        }

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

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

        @Override
        public float getPageWidth(int position) {
            return 1.0f / 3;
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值