Android Glide 图像未显示在第一个屏幕上
Android Glide Image is not showing on the first screen
我正在使用 Android 滑动来加载远程图像,但在这里我遇到了一个奇怪的问题,第一个屏幕上的图像没有显示,但是当我向下滚动并再次向上滚动时,这些图像开始显示 normally.here 是屏幕截图:
我也用谷歌搜索了这样的问题并找到了一个duplicate,在尝试了这些步骤之后它仍然不起作用,你可能需要检查代码,这里是:
public class SiteAdapter extends ArrayAdapter<Site> {
private int resourceId;
private List<Site> sites = null;
private Context context;
private SiteHolder siteHolder;
/**
* @param context the current activity context, we can get it using the super ArrayAdapter constructor
* @param resource the site_layout.xml file
* @param objects the collection to store all the sites
*/
public SiteAdapter(Context context, int resource, List<Site> objects) {
super(context, resource, objects);
this.context = context;
this.resourceId = resource;
this.sites = objects;
}
@Override
public Site getItem(int position) {
return sites.get(position);
}
@Override
public int getCount() {
return sites.size();
}
//get the viewpage which inflate by site_layout.xml file
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Site site = getItem(position);
View view = convertView;
siteHolder = new SiteHolder();
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(resourceId, null);
}
//this place we need to get the whole widget in site_layout.xml file
siteHolder.image = (ImageView) view.findViewById(R.id.thumbnail);
siteHolder.address = (TextView)view.findViewById(R.id.address);
siteHolder.mallName = (TextView) view.findViewById(R.id.name);
siteHolder.distance = (TextView) view.findViewById(R.id.distance);
siteHolder.address.setText(site.getAddress());
//set name of the view
siteHolder.mallName.setText(site.getName());
//set price of the view
//set distance of the view
siteHolder.distance.setText("<" + site.getDistance() + "m");
//set image
ImageTask task = new ImageTask();
task.execute("http://xxxx/springmvc/getFirst/" + site.getName());
return view;
}
//检测adapater中加载网络资源是否可行?结论:不可行
public String getImgUrl(String str){
String data = "";
try {
URL u = new URL(str);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String content = "";
StringBuffer sb = new StringBuffer();
while((content = br.readLine()) != null){
sb.append(content);
}
data = sb.toString();
br.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
class ImageTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... str) {
String data = "";
data = getImgUrl(str[0]);
return data;
}
@Override
protected void onPostExecute(String s) {
Glide.with(context)
.load(s)
.fitCenter()
.into(siteHolder.image);
}
}
class SiteHolder{
ImageView image;
TextView mallName;
TextView address;
TextView distance;
}
}
如果有谁遇到过这样的场景,先谢谢了。
见https://github.com/bumptech/glide/blob/master/README.md#compatibility
Round Pictures: CircleImageView
/CircularImageView
/RoundedImageView
are known to have issues with TransitionDrawable
(.crossFade()
with .thumbnail()
or .placeholder()
) and animated GIFs, use a BitmapTransformation
(.circleCrop()
will be available in v4) or .dontAnimate()
to fix the issue.
简而言之:舍入视图总是将传入的 Drawable 光栅化为位图,如果 Drawable 中有动画(GIF 或 crossFade),这将不起作用。
在第一次加载时,在检索图像时显示占位符,然后淡入淡出到图像;稍后,当您向上滚动时,图像会立即从内存缓存中加载,因此没有动画。
在 https://github.com/bumptech/glide/issues/1508 回复时,我发现了您的图片未加载的潜在根本原因:在 getView
中您覆盖了 siteHolder
,因此无论 ImageTask
完成哪个,它总是更新最后一个绑定行,而不是为任务启动的原始行。有关如何在像这样的双重调度情况下改进 Glide 相关代码的更多技巧,请参阅 GitHub 上的问题。快速而肮脏的修复:
public class SiteAdapter extends ArrayAdapter<Site> {
//private SiteHolder siteHolder; // remove this field
public View getView(int position, View convertView, ViewGroup parent) {
SiteHolder siteHolder = new SiteHolder();
...
ImageTask task = new ImageTask(siteHolder);
...
}
static class ImageTask extends AsyncTask<String, Void, String> {
private SiteHolder siteHolder; // TODO initialize in constructor
// rest stays the same, but notice the `static` modifier above!
}
我正在使用 Android 滑动来加载远程图像,但在这里我遇到了一个奇怪的问题,第一个屏幕上的图像没有显示,但是当我向下滚动并再次向上滚动时,这些图像开始显示 normally.here 是屏幕截图:
public class SiteAdapter extends ArrayAdapter<Site> {
private int resourceId;
private List<Site> sites = null;
private Context context;
private SiteHolder siteHolder;
/**
* @param context the current activity context, we can get it using the super ArrayAdapter constructor
* @param resource the site_layout.xml file
* @param objects the collection to store all the sites
*/
public SiteAdapter(Context context, int resource, List<Site> objects) {
super(context, resource, objects);
this.context = context;
this.resourceId = resource;
this.sites = objects;
}
@Override
public Site getItem(int position) {
return sites.get(position);
}
@Override
public int getCount() {
return sites.size();
}
//get the viewpage which inflate by site_layout.xml file
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Site site = getItem(position);
View view = convertView;
siteHolder = new SiteHolder();
if (view == null) {
LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = vi.inflate(resourceId, null);
}
//this place we need to get the whole widget in site_layout.xml file
siteHolder.image = (ImageView) view.findViewById(R.id.thumbnail);
siteHolder.address = (TextView)view.findViewById(R.id.address);
siteHolder.mallName = (TextView) view.findViewById(R.id.name);
siteHolder.distance = (TextView) view.findViewById(R.id.distance);
siteHolder.address.setText(site.getAddress());
//set name of the view
siteHolder.mallName.setText(site.getName());
//set price of the view
//set distance of the view
siteHolder.distance.setText("<" + site.getDistance() + "m");
//set image
ImageTask task = new ImageTask();
task.execute("http://xxxx/springmvc/getFirst/" + site.getName());
return view;
}
//检测adapater中加载网络资源是否可行?结论:不可行
public String getImgUrl(String str){
String data = "";
try {
URL u = new URL(str);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String content = "";
StringBuffer sb = new StringBuffer();
while((content = br.readLine()) != null){
sb.append(content);
}
data = sb.toString();
br.close();
is.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
class ImageTask extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... str) {
String data = "";
data = getImgUrl(str[0]);
return data;
}
@Override
protected void onPostExecute(String s) {
Glide.with(context)
.load(s)
.fitCenter()
.into(siteHolder.image);
}
}
class SiteHolder{
ImageView image;
TextView mallName;
TextView address;
TextView distance;
}
}
如果有谁遇到过这样的场景,先谢谢了。
见https://github.com/bumptech/glide/blob/master/README.md#compatibility
Round Pictures:
CircleImageView
/CircularImageView
/RoundedImageView
are known to have issues withTransitionDrawable
(.crossFade()
with.thumbnail()
or.placeholder()
) and animated GIFs, use aBitmapTransformation
(.circleCrop()
will be available in v4) or.dontAnimate()
to fix the issue.
简而言之:舍入视图总是将传入的 Drawable 光栅化为位图,如果 Drawable 中有动画(GIF 或 crossFade),这将不起作用。
在第一次加载时,在检索图像时显示占位符,然后淡入淡出到图像;稍后,当您向上滚动时,图像会立即从内存缓存中加载,因此没有动画。
在 https://github.com/bumptech/glide/issues/1508 回复时,我发现了您的图片未加载的潜在根本原因:在 getView
中您覆盖了 siteHolder
,因此无论 ImageTask
完成哪个,它总是更新最后一个绑定行,而不是为任务启动的原始行。有关如何在像这样的双重调度情况下改进 Glide 相关代码的更多技巧,请参阅 GitHub 上的问题。快速而肮脏的修复:
public class SiteAdapter extends ArrayAdapter<Site> {
//private SiteHolder siteHolder; // remove this field
public View getView(int position, View convertView, ViewGroup parent) {
SiteHolder siteHolder = new SiteHolder();
...
ImageTask task = new ImageTask(siteHolder);
...
}
static class ImageTask extends AsyncTask<String, Void, String> {
private SiteHolder siteHolder; // TODO initialize in constructor
// rest stays the same, but notice the `static` modifier above!
}