ViewPager没有刷新

时间:2018-01-01 06:42:39

标签: android

我在我的Android应用程序中使用view pager来显示在特定时间后自动滚动的图像。

在我的OnCreate中,我已经定义了这样的寻呼机:

    List<String> urls;
    urls= new ArrayList<>();
    urls.add("http://<myserver>/adrotatecustom1.png");
    urls.add("http://<myserver>/adrotatecustom2.jpg");
    urls.add("http://<myserver>/adrotatecustom3.jpg");
    urls.add("http://<myserver>/adrotatecustom4.jpg");
    mImageViewPager.setAdapter(new CustomPagerAdapter(getApplicationContext(), urls));
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabDots);
    tabLayout.setupWithViewPager(mImageViewPager, true);
    autoSlider(mImageViewPager);

Autoslider方法:

  public void autoSlider(final ViewPager viewPager) 
     {
       final Handler handler = new Handler();
       final Runnable rr = new Runnable() 
       {
        public void run() 
        {
            int i=0;
            int pos = viewPager.getCurrentItem();
            if(pos >= i && pos != mImages.length - 1){
                i = pos;
                i++;
            }
            else if(pos < (i-1)){
                i = pos;
                i++;
            }
            viewPager.setCurrentItem(i, true);
            i++;
            if (i >= mImages.length)
                i = 0;
                autoSlider(viewPager);

        }};
      handler.postDelayed(rr, 15000);
    }

View Pager适配器:

    public class CustomPagerAdapter extends PagerAdapter {
    Context c;
    private List<String> _imagePaths;
    private LayoutInflater inflater;

    public CustomPagerAdapter(Context c, List<String> imagePaths) {
        this._imagePaths = imagePaths;
        this.c = c;
    }

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

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

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

        inflater = (LayoutInflater) c
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View viewLayout = inflater.inflate(R.layout.activity_viewpagerlayout, container,
                false);

        imgDisplay = (ImageView) viewLayout.findViewById(R.id.imgViewpager);

        Picasso.with(c).load(_imagePaths.get(position)).into(imgDisplay);
        (container).addView(viewLayout);

        return viewLayout;
    }

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

    }
}

问题是它最初工作正常,如果我更改服务器中的图像(具有相同名称的不同图像),它仍然是指旧图像,但我没有旧图像在服务器中的任何位置。任何人都可以帮助我,我在这里失踪了。

5 个答案:

答案 0 :(得分:1)

  

如果我更改服务器中的图像(具有相同名称的不同图像),它仍然指的是旧图像

您需要清除Picasso的缓存,使用此 .memoryPolicy(MemoryPolicy.NO_CACHE) .networkpolicy(NetworkPolicy.NO_CACHE) 清除Picasso的缓存

<强> CODE

Picasso.with(c)
       .load(_imagePaths.get(position))
       .memoryPolicy(MemoryPolicy.NO_CACHE)
       .networkpolicy(NetworkPolicy.NO_CACHE)
       .into(imgDisplay);

答案 1 :(得分:0)

使用滑动库进行图像加载:

 Glide.with(holder.itemView.getContext()).load(_imagePaths.get(position)).
                diskCacheStrategy(DiskCacheStrategy.RESULT).
                placeholder(R.color.off_white).into(holder.imgImage);
build.gradle

中的

compile 'com.github.bumptech.glide:glide:3.7.0'

答案 2 :(得分:0)

  

如果我更改服务器中的图像(具有相同名称的不同图像),它仍然指的是旧图像

     

ViewPager没有在android中刷新

不要使用相同的名称和不同的图片,因为当第一次通过Picasso Lib加载图片时,它会存储在CASH内存中,如果来自服务器您将使用旧名称更改图片Picasso将预测它是同一图片并显示或加载旧图片而不是新图片

所以我的建议是:在从服务器更新图片时,您必须存储与之前版本不同的更新图片名称。

如果您仍然想使用相同的名称,可以使用 .memoryPolicy(MemoryPolicy.NO_CACHE) ,它会删除CACHE

所使用的应用程序的所有Picasso内存

示例

Picasso.with(context)
       .load(listView.get(position))
       .memoryPolicy(MemoryPolicy.NO_CACHE)
       .networkpolicy(NetworkPolicy.NO_CACHE)
       .into(imageView);
  

有关详情 official DOC memory-cache-Piccaso MemoryPolicy类

答案 3 :(得分:0)

它显示旧图像,因为加载图像时URL相同,而像Picaso/Glide这样的库首先从cashe加载图像。因此,如果您要加载新上传的图片,请在timestamp和ImageLoading库中附加URL自动加载新图片。

e.g。 url="http://abc.co/img.jpg?2017-12-31 11:12:13";

在您的情况下更新您的所有imagepaths

答案 4 :(得分:0)

我使用 Glide 加载图片并使用 .diskCacheStrategy(DiskCacheStrategy.NONE)

这是我的方法:

 @Override
public Object instantiateItem(ViewGroup container, int position) {
    ImageView imgDisplay;
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.viewpager_image, container,
            false);
    imgDisplay = viewLayout.findViewById(R.id.image);

    StorageReference storageReference = FirebaseStorage.getInstance().getReferenceFromUrl(_imagePaths.get(position));

    Glide.with(context).load(storageReference)
            .diskCacheStrategy(DiskCacheStrategy.NONE)
            .placeholder(R.drawable.avator)
            .error(R.drawable.avator)
            .into(imgDisplay);


    (container).addView(viewLayout);
    return viewLayout;
}