我有一个ListView显示的东西,其中许多都有一个说明性的图像,其中一些没有。 ViewHolder使用NetworkImageView显示插图。
问题在于,即使设置了默认图像,如果url为空,只要调用setImageUrl(),which in turn will set the source bitmap of the view to null,它就不会显示。如果网址不为空,则会发出请求。这意味着即使没有与该特定视图关联的有效网络URL,也强制一个人发出网络请求,否则不显示默认图像而是显示空视图。
(提交问题:https://code.google.com/p/android/issues/detail?id=59538)
有没有办法在没有有效网址的情况下对项目进行虚假网络请求?
答案 0 :(得分:38)
这对我来说很好用:
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);
答案 1 :(得分:1)
对于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中的图像
答案 2 :(得分:0)
可能你可以试试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);
答案 3 :(得分:0)
ImageView
是一个超类,所以请使用自己的setter方法开始:
niv.setImageResource(R.drawable.icon_no_image_avail); // coerce NetworkImageView to draw itself initially.