NetworkImageView от Volley не появляется в Spinner

Я хочу отобразить изображение, загруженное из сети (с помощью google volley) рядом с текстом счетчика, но по какой-то причине оно не отображается. Фактически, метод getView адаптера вызывается снова и снова, с преобразованием, равным нулю, с помощью некоторого метода измерения внутри Android SDK.

Вот как выглядит мой адаптер:

public class CategoriesSpinnerAdapter extends ArrayAdapter<Category> { private LayoutInflater mLayoutInflater; public CategoriesSpinnerAdapter(Context context, List<Category> objects) { super(context, 0, objects); mLayoutInflater = LayoutInflater.from(context); } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = mLayoutInflater.inflate(R.layout.item_spinner_category, parent, false); } final TextView categoryTitle = (TextView) convertView.findViewById(R.id.scategory_title); categoryTitle.setText(getItem(position).getName()); final NetworkImageView categoryImage = (NetworkImageView) convertView.findViewById(R.id.scategory_image); ImageUtils.load(categoryImage, getItem(position).getIcon()); return convertView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if(convertView == null) { convertView = mLayoutInflater.inflate(R.layout.simple_spinner_category, parent, false); } final TextView categoryTitle = (TextView) convertView.findViewById(R.id.spinner_item_title); categoryTitle.setText(getItem(position).getName()); final NetworkImageView categoryImage = (NetworkImageView) convertView.findViewById(R.id.spinner_item_image); ImageUtils.load(categoryImage, getItem(position).getIcon()); return convertView; } } 

item_spinner_category.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:background="@drawable/top_bar_select_icon" /> <TextView android:id="@+id/scategory_title" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_centerInParent="true" android:textColor="@android:color/white" /> <com.android.volley.toolbox.NetworkImageView android:id="@+id/scategory_image" android:layout_width="32dp" android:layout_height="32dp" android:layout_alignParentRight="true" android:layout_marginRight="3dp" android:layout_centerVertical="true" android:src="@drawable/spinner_games_icon"/> </RelativeLayout> 

Simple_spinner_category.xml :

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spinner_item_title" android:layout_width="fill_parent" android:layout_height="match_parent" android:textSize="14sp" android:gravity="center" android:textColor="@android:color/white" android:background="@drawable/bottom_button_selector"/> <com.android.volley.toolbox.NetworkImageView android:id="@+id/spinner_item_image" android:layout_width="32dp" android:layout_height="32dp" android:layout_alignParentRight="true" android:layout_marginRight="3dp" android:layout_centerVertical="true" /> </RelativeLayout> 

Статическое изображение R.id.scategory_image отображается в течение короткого периода времени, вероятно, пока Volley загрузит сетевое изображение. Функция getDropDownView работает хорошо, изображения отображаются рядом с текстом в раскрывающихся списках, но это не похоже на основной вид.

Любая идея, что может произойти здесь?

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

Выбрав исходный код NetworkImageView , я узнал, что «проблема» была здесь:

 @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); loadImageIfNecessary(true); } 

Итак, просто потому, что я не хотел касаться этой потрясающей структуры, я создал SpinnerNetworkImageView (скопируйте и вставьте из оригинального NewtworkImageView), настроив этот метод:

 @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); loadImageIfNecessary(false); // <-- look @ 'false' } 

Теперь все работает нормально.

Другим способом будет использование обычного ImageView и выполнение ImageRequest в вашем адаптере:

 Response.ErrorListener errorListener = ... Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) { holder.picture.setImageBitmap(bitmap); } }; ImageRequest req = new ImageRequest( url, listener, width, height, Config.ARGB_8888, errorListener); requestQueue.add(request); 

Но я выбрал первое решение.

Я не понимаю, почему вы используете ImageUtils.load. Я использую volley для загрузки изображений таким образом:

 NetworkImageView imageViewIcon = (NetworkImageView) itemView.findViewById(R.id.imageViewIcon); if (imageViewIcon != null && get(position).getPhotos() != null && get(position).getPhotos().length > 0) { imageViewIcon.setImageUrl(get(position).getPhotos()[0], Application.get().getImageLoader()); } 

И imageLoader находится в приложении

 public void onCreate() { super.onCreate(); sInstance = this; RequestQueue queue = Volley.newRequestQueue(this); mApi = new Test_Api(queue); ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() { @Override public void putBitmap(String key, Bitmap value) { mImageCache.put(key, value); } @Override public Bitmap getBitmap(String key) { return mImageCache.get(key); } }; mImageLoader = new ImageLoader(queue, imageCache); }