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