滑动不加载真实图像并停留占位符

时间:2016-04-03 11:21:59

标签: android android-glide

我有一个来自服务器行代码的非常基本的加载图像:

Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).into(view);

出于某种原因,我总是坚持使用显示的占位符,而不是真实的图像!

我已确保传递了有效且有效的网址。并且,如果我在没有占位符的情况下使用相同的代码,那么它可以正常工作

Glide.with(view.getContext()).load(url).into(view);

任何想法为什么?

12 个答案:

答案 0 :(得分:82)

尝试添加.dontAnimate() 它也是由TransitionDrawable引起的,看起来好像滚动之后没有动画因为它被缓存了。 正确的代码是

Glide.with(view.getContext()).load(url).placeholder(R.drawable.default_profile).dontAnimate().into(view);

我希望对你有所帮助

答案 1 :(得分:32)

检查您是否在清单中添加了Internet权限:

<uses-permission android:name="android.permission.INTERNET"/>

如果没有互联网连接,Glide不会触发异常。

答案 2 :(得分:3)

在清单的应用程序标签中添加android:usesCleartextTraffic =“ true”,并检查是否在同一清单文件中提到了互联网许可:-

答案 3 :(得分:2)

使用ProgressBar作为加载gif

Glide.with(context).
        load(url)
        .listener(new RequestListener<String, GlideDrawable>() {
            @Override
            public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                progressBar.setVisibility(View.GONE);
                return false;
            }

            @Override
            public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                progressBar.setVisibility(View.GONE);
                return false;
            }
        })
        .crossFade(1000)
        .into(imageView);

答案 4 :(得分:2)

如果将来有人遇到此问题,您可能需要添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

确定此更改的确切原因,但我的代码在没有该权限的情况下无效,现在可以使用它。

答案 5 :(得分:2)

如果您尝试以下步骤:

  • 已在清单和程序中添加了 INTERNET 权限
  • usesCleartextTraffic : 如果已经在 Manifest 中提到 即使图像未在 ImageView 中加载

然后试试这个:

  • 添加此行 application 清单的标签
android:usesCleartextTraffic="true"
  • 在您尝试执行操作的活动或片段顶部添加以下代码
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

答案 6 :(得分:1)

不要为Glide使用过渡或动画,它会解决您的问题

代码:

Glide.with(context)
    .load(horizontalHappyHourList.get(position).getImage())
//  .transition(DrawableTransitionOptions.withCrossFade(400)) //Optional
    .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.RESOURCE)
    .error(R.drawable.no_image))
    .into(holder.imageView);

答案 7 :(得分:0)

似乎很奇怪,但我唯一可以猜到的是你的网址是有效的,正如你已经说过的那样。您的遥控器即使已应用于您的图像视图也会被下载,但您的占位符会以某种方式隐藏它。 Glide有一些与占位符相关的错误。

我的建议是尝试以下内容:

Glide.with(view.getContext()).load(url).
placeholder(R.drawable.default_profile).fitCenter().into(view);

所以诀窍是占位符是通过setImageDrawable()设置的,所以ImageView会像往常一样显示它,但是你告诉Glide明确地使用fitCenter,这将很好地适合加载的图像通过转换在ImageView的布局大小内,然后通过setImageDrawable()进行设置。由于拟合的图像非常合适,因此中心只会绘制覆盖整个视图区域的图像。

试一试。

答案 8 :(得分:0)

以下是对我有用的奇怪修复程序。

以下对我来说总是失败的(12次试用)-我从没看到真实的图像:

Glide.with(context)
 .load(url)
 .asBitmap()
 .into(new SimpleTarget<Bitmap>(iconWidth, iconHeight) { ... }

以下对我而言总是成功的(12次试用)-我总是看到真实的图像:

Glide.with(context)
 .load(url)
 .asBitmap()
 .listener(new RequestListener() {
    public boolean onException(Exception e,Object o,Target t,boolean b)
               {return false;}
    public boolean onResourceReady(Object o,Object p,Target t,boolean b,boolean c)  
               {return false;}})
 .into(new SimpleTarget<Bitmap>(iconWidth, iconHeight) { ... }

如您所见,这里唯一的区别是我添加了一个侦听器。毫无道理,但是这些试验都是非常仔细地完成的,因此我将继续进行。

答案 9 :(得分:0)

以上所有解决方案都不适合我。问题可能出在您使用的占位符。如果您用于加载图像的视图具有占位符,则会引起一些问题。出于某种原因删除该占位符似乎可以解决该问题。

因此,如果您要膨胀的(Image)视图具有占位符,例如 android:src =“ @ mipmap / placeholder” ,则将其删除。

        <ImageView
            android:id="@+id/imgGallery"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            android:src="@mipmap/rugova1" />

像这样

 <ImageView
            android:id="@+id/imgGallery"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            />

对我有用。

答案 10 :(得分:0)

可以帮助某人:) 我的问题是网络安全策略异常。由于安全政策,Android封锁了Glide请求的网址。

通过将所需域列入白名单来解决。 Check here

com.bumptech.glide.load.engine.GlideException: Failed to load resource
There was 1 cause:
java.net.UnknownServiceException(CLEARTEXT communication to maps.googleapis.com not permitted by the network security policy)
 call GlideException#logRootCauses(String) for more detail

最困难的是它没有在正常日志中显示。

答案 11 :(得分:0)

如果以上方法均不能解决问题,并且您在ImageView上设置了'src'属性,则它将无法正常工作。我错误地在xml中的ImageView上设置了“ src”,然后取出来解决了这个问题。