Отображение изображения по умолчанию NetworkImageView без запроса сети

У меня есть ListView, отображающий вещи, многие из которых имеют иллюстративный образ, а некоторые из них этого не делают. ViewHolder использует NetworkImageView для отображения иллюстраций.

Проблема заключается в том, что даже если установлено изображение по умолчанию, оно не будет отображаться до тех пор, пока не будет вызвана функция setImageUrl(), которая, в свою очередь, установит исходное растровое изображение null, если URL-адрес пуст. Если URL-адрес не пуст, он делает запрос. Это означает, что вы вынуждены делать сетевой запрос, даже если не существует допустимого сетевого URL-адреса, связанного с этим конкретным видом, иначе вместо отображения изображения по умолчанию отображается пустой вид.

(выдано: https://code.google.com/p/android/issues/detail?id=59538)

Есть ли способ сделать ложные сетевые запросы для элементов без действительного URL?

Ответ 1

Это отлично работает для меня:

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

Ответ 2

Для 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

Ответ 3

Возможно, вы можете попробовать андроид: 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 может это сделать

Устанавливает идентификатор ресурса изображения по умолчанию, который будет использоваться для этого представления, до тех пор, пока попытка его загрузки завершена.

просто, когда вы определяете свой

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

Ответ 4

ImageView является суперклассом, поэтому для начала используйте свой собственный метод setter:

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