1

У меня возникла особая проблема. У меня есть gridview музыкальных жанров. В каждом элементе сетки мы можем отображать до 3 уменьшенных изображений в каскадном режиме (аналогично жанрам Google Play Музыки). Однако, когда я просматриваю страницу и прокручиваю назад, я обнаруживаю, что все изображения в разных элементах сетки случайным образом перетасовываются.Почему мои ImageViews искажаются при прокрутке вниз?

правильного расположение http://i.stack.imgur.com/yc06v.png

искаженной раскладка (случайное изображение) http://i.stack.imgur.com/DxoMC.png

Вот сегмент кода, который имеет дело с imageviews:

String[] al_id ={MediaStore.Audio.Albums.ALBUM_ID}; 
    String orderby = MediaStore.Audio.Albums.ALBUM_ID; 
    Cursor albumcursor = context.getContentResolver().query(uri, al_id,null, null, orderby); 
    Set<Long> set = new LinkedHashSet<Long>(); 


    if(tempcursor.moveToFirst()){ 

     do{ 
      long id = tempcursor.getLong(tempcursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)); 
      set.add(id); 
     }while(tempcursor.moveToNext()); 

    } 


    if(set.size()==1){ 
     Iterator<Long> it = set.iterator(); 

     long id = it.next(); 
     ImageView albumArt = (ImageView) view.findViewById(R.id.albumart_zero); 
     Bitmap img = getAlbumart(context, id); 
     if(img != null) 
      albumArt.setImageBitmap(img); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt.setImageBitmap(def); 

     } 
    } 
    else if(set.size()==2){ 
     Iterator<Long> it = set.iterator(); 
     long id = it.next(); 
     ImageView albumArt1 = (ImageView) view.findViewById(R.id.albumart_one); 
     albumArt1.setScaleType(ImageView.ScaleType.FIT_XY); 
     Bitmap img = getAlbumart(context, id); 
     if(img != null) 
      albumArt1.setImageBitmap(img); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt1.setImageBitmap(def); 

     } 
     long id2 = it.next(); 
     ImageView albumArt2 = (ImageView) view.findViewById(R.id.albumart_two); 
     albumArt2.setScaleType(ImageView.ScaleType.FIT_XY); 
     Bitmap img2 = getAlbumart(context, id2); 
     if(img2 != null) 
      albumArt2.setImageBitmap(img2); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt2.setImageBitmap(def); 

     } 
    } 
    else if(set.size()>=3){ 
     Iterator<Long> it = set.iterator(); 

     long id = it.next(); 
     ImageView albumArt1 = (ImageView) view.findViewById(R.id.albumart_one); 
     albumArt1.setScaleType(ImageView.ScaleType.FIT_XY); 
     Bitmap img = getAlbumart(context, id); 
     if(img != null) 
      albumArt1.setImageBitmap(img); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt1.setImageBitmap(def); 

     } 

     long id2 = it.next(); 
     ImageView albumArt2 = (ImageView) view.findViewById(R.id.albumart_two); 
     albumArt2.setScaleType(ImageView.ScaleType.FIT_XY); 
     Bitmap img2 = getAlbumart(context, id2); 
     if(img2 != null) 
      albumArt2.setImageBitmap(img2); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt2.setImageBitmap(def); 

     } 

     long id3 = it.next(); 
     ImageView albumArt3 = (ImageView) view.findViewById(R.id.albumart_three); 
     albumArt3.setScaleType(ImageView.ScaleType.FIT_XY); 
     Bitmap img3 = getAlbumart(context, id3); 
     if(img3 != null) 
      albumArt3.setImageBitmap(img3); 
     else{ 
      Bitmap def = getDefaultAlbumArt(context); 
      albumArt3.setImageBitmap(def); 

     } 
    } 

А вот макет элемента сетки:

<LinearLayout 
android:layout_width="160dp" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:background="@color/metalList" 
android:layout_marginLeft="10dp" 
android:layout_marginTop="10dp" 
android:elevation="4dp" 
xmlns:android="http://schemas.android.com/apk/res/android"> 
<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="80dp" 
    android:clipToPadding="false" 
    android:background="#E9E0D5"> 
    <ImageView 
     android:id="@+id/albumart_zero" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="top" 
     android:scaleType="centerCrop" 
     android:layout_alignParentLeft="true" 
     android:elevation="0dp" 
     /> 

    <ImageView 
     android:id="@+id/albumart_two" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:layout_gravity="top" 
     android:layout_alignParentRight="true" 
     android:layout_margin="0dp" 
     android:elevation="2dp" 
     /> 
    <ImageView 
     android:id="@+id/albumart_three" 
     android:layout_width="80dp" 
     android:layout_height="800dp" 
     android:layout_gravity="top" 
     android:layout_marginLeft="40dp" 
     android:elevation="4dp" 
     /> 
    <ImageView 
     android:id="@+id/albumart_one" 
     android:layout_width="80dp" 
     android:layout_height="80dp" 
     android:layout_gravity="top" 
     android:layout_margin="0dp" 
     android:layout_alignParentLeft="true" 
     android:elevation="10dp" 
     /> 
</RelativeLayout> 
<TextView 
    android:id="@+id/genre_name" 
    android:layout_height="25dp" 
    android:layout_width="match_parent" 
    android:textColor="@color/metalTextB" 
    android:layout_marginTop="3dp" 
    android:layout_marginLeft="10dp" 
    android:textSize="16sp" 
    android:typeface="sans" 
    android:text="Genre" 
    android:scrollHorizontally="true" 
    android:ellipsize="end" 
    android:maxLines="1"/> 
<TextView 
    android:id="@+id/genre_count" 
    android:layout_width="match_parent" 
    android:layout_height="15dp" 
    android:layout_below="@id/genre_name" 
    android:layout_marginLeft="15dp" 
    android:layout_marginBottom="3dp" 
    android:textColor="@color/metalTextS" 
    android:textSize="13sp" 
    android:text="artist" 
    android:typeface="sans" 
    android:scrollHorizontally="true" 
    android:ellipsize="end" 
    android:maxLines="1"/> 
</LinearLayout> 

P помощь в аренде.

+0

Я чувствую, что вы столкнулись с этой проблемой, потому что изображения имеют разные разрешения, поэтому вы можете использовать android: scaleType = "" –

+0

Что делает getAlbumart? – MidasLefko

+0

@MidasLefko Получает альбомное искусство из ALBUM_ID медиафайла. Я использовал точно такие же методы в других представлениях и получил отличный результат. –

ответ

0

Я понял, что это имеет какое-то отношение к ImageViews, которые не инициализированы. Я заметил, что из всех элементов сетки те, на которых были инициализированы все ImageViews, не пострадали от эффекта перетасовки. Как только я инициализировал все изображения с изображением по умолчанию, он работал отлично.