Android Glide изображение не отображается на первом экране
Я использую Android glide для загрузки удаленных изображений, но здесь я столкнулся со странной проблемой, изображение на первом экране не отображается, но в то время как я прокручиваю вниз и прокручиваю вверх снова, эти изображения становятся показываемыми нормально.вот снимок экрана: Я также погуглил такой вопрос и нашел дубликат , и после попытки таких шагов он все еще не работает, и вам, возможно, потребуется проверить код, вот он:
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;
}
}
Если есть кто-нибудь, кто встречал такую сцену раньше, спасибо в продвижение.
2 ответа:
При ответе на 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! }
См. https://github.com/bumptech/glide/blob/master/README.md#compatibility
Круглые картинки:
CircleImageView
/CircularImageView
/RoundedImageView
известны случаи проблем СTransitionDrawable
(.crossFade()
с.thumbnail()
или.placeholder()
) и анимированными GIF-файлами используйтеBitmapTransformation
(.circleCrop()
будет доступен в v4) или.dontAnimate()
, чтобы устранить проблему.Короче говоря: округляющие представления всегда растеризуют входящие чертежи в растровые изображения, которые не будут работать, если внутри них есть анимация. Рисование (GIF или crossFade).
При первой загрузке заполнитель отображается во время извлечения изображения, а затем перетекает в изображение; позже, когда вы прокручиваете изображение, оно сразу загружается из кэша памяти, поэтому анимации нет.