web-dev-qa-db-ja.com

ネットワーク要求なしでNetworkImageViewのデフォルト画像を表示する

私は物事を表示するListViewを持っていますが、その多くには説明用の画像があり、一部にはありません。 ViewHolderはNetworkImageViewを使用してイラストを表示します。

問題は、デフォルトの画像が設定されていても、setImageUrl()を呼び出すまで表示されないことです RLが空の場合はビューのソースビットマップがnullに設定されます 。 URLが空でない場合は、リクエストを行います。これは、その特定のビューに関連付けられた有効なネットワークURLがない場合でも、ネットワーク要求を行うことを強制されることを意味します。そうでない場合、デフォルトの画像を表示する代わりに、空のビューを表示します。

(提出された問題: https://code.google.com/p/Android/issues/detail?id=59538

有効なURLのないアイテムに対して偽のネットワークリクエストを行う方法はありますか?

13
Turnsole

これは私にとっては問題なく機能します:

    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);
39
Androiderson

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から画像に言及することもできます

1
Jimit Patel

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);
0
Mina Fawzy

ImageViewはスーパークラスなので、独自のセッターメソッドを使用して開始します。

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