显示没有网络请求的NetworkImageView的默认图像

时间:2014-02-05 01:35:41

标签: android android-volley networkimageview

我有一个ListView显示的东西,其中许多都有一个说明性的图像,其中一些没有。 ViewHolder使用NetworkImageView显示插图。

问题在于,即使设置了默认图像,如果url为空,只要调用setImageUrl(),which in turn will set the source bitmap of the view to null,它就不会显示。如果网址不为空,则会发出请求。这意味着即使没有与该特定视图关联的有效网络URL,也强制一个人发出网络请求,否则不显示默认图像而是显示空视图。

(提交问题:https://code.google.com/p/android/issues/detail?id=59538

有没有办法在没有有效网址的情况下对项目进行虚假网络请求?

4 个答案:

答案 0 :(得分:38)

这对我来说很好用:

    String url = getURL();
    NetworkImageView niv = (NetworkImageView)rootView.findViewById(R.id.niv);
    if(url.length() > 0)
        niv.setImageUrl(url, imageLoader);
    niv.setDefaultImageResId(R.drawable._default);
    niv.setErrorImageResId(R.drawable.error);

答案 1 :(得分:1)

对于NetworkImageView,有一个名为mDefaultImageId的变量 您可以使用它来定义默认图像的资源

以下是如何做到的 -

创建一个名为attrs.xml的文件,其中包含以下行 -

<declare-styleable name="DefaultImageResId">
    <attr name="default_image_resource" format="reference" />
</declare-styleable>

创建一个名为CustomNetworkImageView的类并使用以下代码 -

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;

import com.android.volley.toolbox.NetworkImageView;
import com.myapp.R;

public class CustomNetworkImageView extends NetworkImageView {
    public CustomNetworkImageView(Context context) {
        super(context);
    }

    public CustomNetworkImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setDefaultImageResId(context, attrs);
    }

    public CustomNetworkImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setDefaultImageResId(context, attrs);
    }

    private void setDefaultImageResId(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DefaultImageResId);
        int resId = typedArray.getResourceId(R.styleable.DefaultImageResId_default_image_resource, 0);

        if (0 != resId)
            setDefaultImageResId(resId);
    }
}

现在在常规布局xml文件中使用如下 -

<com.myapp.CustomNetworkImageView xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/img"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     app:default_image_resource="@drawable/defaultimage"/>

请记住,行xmlns:app="http://schemas.android.com/apk/res-auto"在布局文件的根元素中非常重要 然后添加app:default_image_resource

你完成了!!!现在你甚至可以提到xml中的图像

答案 2 :(得分:0)

可能你可以试试android:background =“yourdrawable”

<com.android.volley.toolbox.NetworkImageView
                    android:id="@+id/puppy_imageView"
                    android:layout_width="110dp"
                    android:layout_height="110dp"
                    android:scaleType="centerCrop"
                    android:background="@drawable/drawablename"

                    />

更新答案

在我尝试这个答案后,我认为新图像将覆盖背景,所以它不是很好的答案

根据文档 setDefaultImageResId 可以执行此操作

  

设置要用于此视图的默认图像资源ID,直到   尝试加载它完成。

只需在您定义

NetworkImageView _ImageView = (NetworkImageView) findViewById(R.id.imageview);
_ImageView.setDefaultImageResId(R.drawable.yourdrawable);

答案 3 :(得分:0)

ImageView是一个超类,所以请使用自己的setter方法开始:

niv.setImageResource(R.drawable.icon_no_image_avail);   // coerce NetworkImageView to draw itself initially.