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

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

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

(проблема подана: https://code.google.com/p/android/issues/detail?id=59538)

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

4 ответа

Решение

Это прекрасно работает для меня:

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

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

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

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

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

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

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

niv.setImageResource(R.drawable.icon_no_image_avail);   // coerce NetworkImageView to draw itself initially.
Другие вопросы по тегам