2015-07-02 4 views
0

При реализации палитры с моим GridView у меня возникают проблемы с прокруткой.Сбои с использованием палитры с GridView

В принципе, здесь ситуация: каждый из элементов в GridView имеет строку заголовка и изображение, которое загружается. С помощью палитры строка заголовка должна изменяться на извлеченный цвет, который извлекает палитра.

Но случается так, что каждый раз, когда я прокручиваю вниз по экрану сетки, а затем прокручиваю назад, позиционирование изменяется с цветом фона панели.

Вот пример:

enter image description here

Затем, когда я прокрутила и прокручивается снова:

enter image description here

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

Я делаю это в своем адаптере для альбома, вот код и, надеюсь, кто-то может вести меня в правильном направлении.

public class AlbumAdapterNew extends ArrayAdapter<String> { 

ArrayList<String> names; 
Activity context; 
ArrayList<String> coverPaths; 
String coverPath; 
Drawable img; 
Bitmap bitmap; 
ViewHolder mViewHolder = null; 
ImageLoader imageLoader = ImageLoader.getInstance(); 
private RelativeLayout background; 

static class ViewHolder { 

    private TextView text; 
    private ImageView image; 

} 

public AlbumAdapterNew(Activity context, ArrayList<String> names, 
     ArrayList<String> coverPaths) { 
    super(context, R.layout.albums_row, names); 

    this.names = names; 
    this.context = context; 
    this.coverPaths = coverPaths; 

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 

    .displayer(new FadeInBitmapDisplayer(500)) 

    .build(); 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
      context) 

    .defaultDisplayImageOptions(defaultOptions) 

    .build(); 
    ImageLoader.getInstance().init(config); // Do it on Application start 

} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    if (convertView == null) { 
     mViewHolder = new ViewHolder(); 
     LayoutInflater vi = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = vi.inflate(R.layout.albums_row, parent, false); 
     mViewHolder.text = (TextView) convertView 
       .findViewById(R.id.albumTextView); 
     mViewHolder.image = (ImageView) convertView 
       .findViewById(R.id.album_photo); 
     background = (RelativeLayout) convertView 
       .findViewById(R.id.containerText); 
     convertView.setTag(mViewHolder); 

    } 

    else { 

     mViewHolder = (ViewHolder) convertView.getTag(); 

    } 

    mViewHolder.text.setText(names.get(position)); 

    if (coverPaths.get(position) != null && !coverPaths.isEmpty()) { 

     mViewHolder.image.setScaleType(ScaleType.CENTER_CROP); 

     Glide.with(context).load("file:///" + coverPaths.get(position)) 
       .asBitmap() 
       .into(new BitmapImageViewTarget(mViewHolder.image) { 
        @Override 
        protected void setResource(Bitmap resource) { 
         // Do bitmap magic here 

         Palette.from(resource).generate(
           new Palette.PaletteAsyncListener() { 
            public void onGenerated(Palette palette) { 
             Palette.Swatch vibrantSwatch = palette 
               .getVibrantSwatch(); 
             if (vibrantSwatch != null) { 

              background 
                .setBackgroundColor(vibrantSwatch 
                  .getRgb()); 

             } 
            } 
           }); 

         super.setResource(resource); 
        } 
       }); 

    } else { 

     mViewHolder.image.setScaleType(ScaleType.CENTER_INSIDE); 

     imageLoader.displayImage("drawable://" + R.drawable.music_record, 
       mViewHolder.image); 

    } 

    return convertView; 
} 

} 
+0

Выполняется ли ваш код через 'if (coverPaths.get (position)! = Null &&! CoverPaths.isEmpty())' для каждой ячейки при прокрутке вверх? Возможно, нет, и это может быть проблемой (поскольку «Палитра» используется только там). – shkschneider

+0

Почему бы не пройти это снова? это не имеет большого смысла для меня. – Jack

+0

Моя идея заключалась в том, что переработанное представление было неправильным или что исходное изображение было неправильным. Но это была просто идея, у меня нет точного ответа, поэтому простой комментарий :) – shkschneider

ответ

0

При создании Palette, вы должны сохранить его на свой ViewHolder в обратный вызов. Помимо Palette, который является дорогостоящим для создания, это всегда держит ваши экземпляры Palette в синхронизации с элементом сетки, обрабатываемым при привязке данных от ViewHolder.

EDIT: В соответствии с запросом, пример. У меня не было компьютера с SDK удобным, так что это из памяти, но это должно заставить вас идти в правильном направлении!

public class AlbumAdapterNew extends ArrayAdapter<String> { 

    ArrayList<String> names; 
    Activity context; 
    ArrayList<String> coverPaths; 
    String coverPath; 
    Drawable img; 
    Bitmap bitmap; 
    ImageLoader imageLoader = ImageLoader.getInstance(); 

    static class ViewHolder { 

     private TextView text; 
     private ImageView image; 
     private Palette palette; 
     private RelativeLayout background; 

    } 

    public AlbumAdapterNew(Activity context, ArrayList<String> names, 
          ArrayList<String> coverPaths) { 
     super(context, R.layout.albums_row, names); 

     this.names = names; 
     this.context = context; 
     this.coverPaths = coverPaths; 

     DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      .displayer(new FadeInBitmapDisplayer(500)) 
      .build(); 

     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
      .defaultDisplayImageOptions(defaultOptions) 
      .build(); 
     ImageLoader.getInstance().init(config); // Do it on Application start 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // This should be local so you don't get conflicts 
     ViewHolder viewHolder; 

     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      LayoutInflater vi = LayoutInflater.from(parent.getContext()); 
      convertView = vi.inflate(R.layout.albums_row, parent, false); 
      viewHolder.text = (TextView) convertView 
        .findViewById(R.id.albumTextView); 
      viewHolder.image = (ImageView) convertView 
        .findViewById(R.id.album_photo); 
      viewHolder.background = (RelativeLayout) convertView 
        .findViewById(R.id.containerText); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.text.setText(names.get(position)); 

     if (coverPaths.get(position) != null && !coverPaths.isEmpty()) { 
      viewHolder.image.setScaleType(ScaleType.CENTER_CROP); 
      Glide.with(context) 
        .load("file:///" + coverPaths.get(position)) 
        .asBitmap() 
        .into(new BitmapImageViewTarget(viewHolder.image) { 
         @Override 
         protected void setResource(Bitmap resource) { 
          // Do bitmap magic here 

          if(viewHolder.palette != null) { 
           setViewBackgroundColor(viewHolder) 
          } else { 
           Palette.from(resource).generate(
            new Palette.PaletteAsyncListener() { 
             public void onGenerated(Palette palette) { 
              viewHolder.palette = palette; 
              setViewBackgroundColor(vh); 
             } 
            }); 
          } 
          super.setResource(resource); 
         } 
        }); 
     } else { 
      mViewHolder.image.setScaleType(ScaleType.CENTER_INSIDE); 
      imageLoader.displayImage("drawable://" + R.drawable.music_record, 
        mViewHolder.image); 
     } 

     return convertView; 
    } 

    private void setViewBackgroundColor(ViewHolder vh) { 
     Palette.Swatch swatch = vh.palette.getVibrantSwatch(); 
     if(swatch != null) { 
      vh.background.setBackgroundColor(swatch.getRgb()); 
     } 
    } 
} 
+0

Хорошая точка действительно (палитра * все еще * дорогая), но я думаю, что это должен быть комментарий, так как он не решает проблему OP. – shkschneider

+0

Да, дорогая часть была в стороне, но кеширование палитры и использование ее из ViewHolder должно решить проблему, так как это не нужно пересчитывать на лету и использовать устаревшие ссылки на представления – berwyn

+0

О, я не думал об этом , Может, действительно ... – shkschneider

Смежные вопросы