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

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

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

(ошибка зарегистрирована: https://code.google.com/p/android/issues/detail?id=59538)

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


person Turnsole    schedule 05.02.2014    source источник
comment
Лучшее, что я могу придумать на данный момент, это замена NetworkImageView ванильным ImageView во время выполнения, что, возможно, немного менее неэффективно, чем дополнительные сетевые запросы, но все же неэффективно.   -  person Turnsole    schedule 05.02.2014


Ответы (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);
person Androiderson    schedule 08.02.2014
comment
На самом деле он отображает изображение по умолчанию, даже если URL-адрес не установлен? - person Turnsole; 09.02.2014
comment
@Turnsole да. Убедитесь, что вы используете действующий код Volley. - person Androiderson; 09.02.2014
comment
Вы правы, это уже исправили. Я просто не вытащил последнюю версию. - person Turnsole; 10.02.2014
comment
Какой смысл продлевать ImageView, если они собираются сломать setImageDrawable? - person Martin Konecny; 05.09.2014
comment
Я использую тот же код, но изображение по умолчанию иногда не отображается. Вместо этого он показывает изображение в файле xml. Что я могу сделать? - person Bagusflyer; 13.05.2015

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

person Jimit Patel    schedule 17.10.2015

может быть, вы можете попробовать 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);
person Mina Fawzy    schedule 29.11.2015

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

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