Отображать изображение по умолчанию 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.