Intereting Posts
Программный аксессуар для Android на Windows Как открыть Gmail Compose при нажатии кнопки в приложении Android? Как можно получить доступ к методу NotificationListenerService? Генератор значков Android для панели действий и уведомление не работают (серая форма) Какие форматы изображений следует использовать в приложении для Android? Как выполнить UnitTest службу Android, которая зависит от сетевого подключения Objdump файла .so? Нужна помощь для понимания сообщений Google InAppBilling onPurchaseStateChange никогда не вызывается Что такое crtbegin.o и crtbegin_dynamic.o? Как обнаружить ошибки сохранения изображений в каталоге неправильной плотности Android? Разработана ли разработка Android UI хорошо для шаблона дизайна? Панель действий перепуталась после использования setTitle Создание ImageView с определенным стилем программно Как сохранять cookie при использовании HTTPUrlConnection? Тесты Travis-CI для Android с поддержкой Gradle

Android Glide Image не отображается на первом экране

Я использую 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; } } 

Если кто-нибудь, кто встретил такую ​​сцену раньше, спасибо вам заранее.

Отвечая на 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 , используйте BitmapTransformation ( .circleCrop() будет доступно в версии 4) или .dontAnimate() чтобы исправить проблему.

Короче: округленные представления всегда растеризуют входящие Drawables в Bitmaps, которые не будут работать, если в Drawable (GIF или crossFade) есть анимация.

При первом загрузке отображается местозаполнитель при извлечении изображения, а затем crossFaded на изображение; Позже, когда вы прокручиваете изображение, изображение сразу загружается из кеша памяти, поэтому анимации нет.