使用调色板的GridView故障 [英] Troubles with using Palette with GridView

查看:305
本文介绍了使用调色板的GridView故障的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的GridView控件实现调色板,我有滚动的麻烦。

基本上,这里的情况:在GridView的项目中的每一个都有一个标题栏和图像的加载。使用调色板,标题栏应该改变为提取颜色调色板中提取。

但是,什么情况是,我每次向下滚动网格视图,然后滚动回涨,与酒吧的背景颜色的定位变化。

下面是一个例子:

当我已经向下滚动,然后再次向上滚动

然后:

此外,着色似乎并不很正确要么不是吗?由于某种原因,它看起来像它只是选择已加载的最后一种颜色,有时它甚至不加载在所有你可以看到在看吧。

我在我的专辑适配器这样做,这里的code和希望有人能指导我在正确的方向。

 公共类AlbumAdapterNew扩展ArrayAdapter<串GT; {ArrayList的<串GT;名称;
活动背景;
ArrayList的<串GT; coverPaths;
串coverPath;
可绘制IMG;
位图位图;
ViewHolder mViewHolder = NULL;
ImageLoader的ImageLoader的= ImageLoader.getInstance();
私人RelativeLayout的背景;静态类ViewHolder {    私人TextView的文本;
    私人ImageView的形象;}公共AlbumAdapterNew(Activity上下文,ArrayList的<串GT;的名字,
        ArrayList的<串GT; coverPaths){
    超(背景下,R.layout.albums_row,姓名);    this.names =名称;
    this.context =背景;
    this.coverPaths = coverPaths;    DisplayImageOptions defaultOptions =新DisplayImageOptions.Builder()    .displayer(新FadeInBitmapDisplayer(500))    。建立();
    ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(
            上下文)    .defaultDisplayImageOptions(defaultOptions)    。建立();
    。ImageLoader.getInstance()的init(配置); //做它在应用程序启动}@覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup){
    // TODO自动生成方法存根    如果(convertView == NULL){
        mViewHolder =新ViewHolder();
        LayoutInflater VI =(LayoutInflater)上下文
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.albums_row,父母,假);
        mViewHolder.text =(TextView中)convertView
                .findViewById(R.id.albumTextView);
        mViewHolder.image =(ImageView的)convertView
                .findViewById(R.id.album_photo);
        背景=(RelativeLayout的)convertView
                .findViewById(R.id.containerText);
        convertView.setTag(mViewHolder);    }    其他{        mViewHolder =(ViewHolder)convertView.getTag();    }    mViewHolder.text.setText(names.get(位置));    如果(coverPaths.get(位置)=空&放大器;!&放大器;!coverPaths.isEmpty()){        mViewHolder.image.setScaleType(ScaleType.CENTER_CROP);        Glide.with(上下文).load(文件:///+ coverPaths.get(位置))
                .asBitmap()
                .into(新BitmapImageViewTarget(mViewHolder.image){
                    @覆盖
                    保护无效setResource(位图资源){
                        //位图做这里的魔法                        Palette.from(资源).generate(
                                新Palette.PaletteAsyncListener(){
                                    公共无效onGenerated(调色板调色板){
                                        Palette.Swatch vibrantSwatch =调色板
                                                .getVibrantSwatch();
                                        如果(vibrantSwatch!= NULL){                                            背景
                                                    .setBackgroundColor(vibrantSwatch
                                                            .getRgb());                                        }
                                    }
                                });                        super.setResource(资源);
                    }
                });    }其他{        mViewHolder.image.setScaleType(ScaleType.CENTER_INSIDE);        imageLoader.displayImage(绘://+ R.drawable.music_record,
                mViewHolder.image);    }    返回convertView;
}}


解决方案

当您创建调色板,你应该将其保存到 ViewHolder 回调。除了调色板正在打造昂贵的,这总是让你的调色板实例与电网项目同步,你正在处理从绑定的数据 ViewHolder

编辑:按照要求,一个排序的例子。我没有用SDK方便的一台电脑,所以这是从内存,但它应该让你在正确的方向前进!

 公共类AlbumAdapterNew扩展ArrayAdapter<串GT; {    ArrayList的<串GT;名称;
    活动背景;
    ArrayList的<串GT; coverPaths;
    串coverPath;
    可绘制IMG;
    位图位图;
    ImageLoader的ImageLoader的= ImageLoader.getInstance();    静态类ViewHolder {        私人TextView的文本;
        私人ImageView的形象;
        私人调色板调色板;
        私人RelativeLayout的背景;    }    公共AlbumAdapterNew(Activity上下文,ArrayList的<串GT;的名字,
                           ArrayList的<串GT; coverPaths){
        超(背景下,R.layout.albums_row,姓名);        this.names =名称;
        this.context =背景;
        this.coverPaths = coverPaths;        DisplayImageOptions defaultOptions =新DisplayImageOptions.Builder()
            .displayer(新FadeInBitmapDisplayer(500))
            。建立();        ImageLoaderConfiguration配置=新ImageLoaderConfiguration.Builder(上下文)
            .defaultDisplayImageOptions(defaultOptions)
            。建立();
        。ImageLoader.getInstance()的init(配置); //做它在应用程序启动    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        //这应该是当地的,所以你没有得到冲突
        ViewHolder viewHolder;        如果(convertView == NULL){
            viewHolder =新ViewHolder();
            LayoutInflater VI = LayoutInflater.from(parent.getContext());
            convertView = vi.inflate(R.layout.albums_row,父母,假);
            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);
        }其他{
            viewHolder =(ViewHolder)convertView.getTag();
        }        viewHolder.text.setText(names.get(位置));        如果(coverPaths.get(位置)=空&放大器;!&放大器;!coverPaths.isEmpty()){
            viewHolder.image.setScaleType(ScaleType.CENTER_CROP);
            Glide.with(上下文)
                    .load(文件:///+ coverPaths.get(位置))
                    .asBitmap()
                    .into(新BitmapImageViewTarget(viewHolder.image){
                        @覆盖
                        保护无效setResource(位图资源){
                            //位图做这里的魔法                            如果(viewHolder.palette!= NULL){
                                setViewBackgroundColor(viewHolder)
                            }其他{
                                Palette.from(资源).generate(
                                    新Palette.PaletteAsyncListener(){
                                        公共无效onGenerated(调色板调色板){
                                            viewHolder.palette =调色板;
                                            setViewBackgroundColor(VH);
                                        }
                                    });
                            }
                            super.setResource(资源);
                        }
                    });
        }其他{
            mViewHolder.image.setScaleType(ScaleType.CENTER_INSIDE);
            imageLoader.displayImage(绘://+ R.drawable.music_record,
                    mViewHolder.image);
        }        返回convertView;
    }    私人无效setViewBackgroundColor(ViewHolder VH){
        Palette.Swatch样本= vh.palette.getVibrantSwatch();
        如果(样本!= NULL){
            vh.background.setBackgroundColor(swatch.getRgb());
        }
    }
}

When implementing Palette with my GridView, I am having trouble with scrolling.

Basically, here's the situation: Each one of the items in the GridView has a title bar and an Image that loads. Using the Palette, the title bar is supposed to change to the extracted color that the Palette extracts.

But what happens is that every time I scroll down the Grid View, and then scroll back up, the positioning changes with the bar background color.

Here's an example:

Then when I have scrolled down and scrolled up again:

Also, the coloring doesn't seem to be quite right either does it? for some reason it looks like it just selects the last color that was loaded, and sometimes it doesn't even load at all as you can see looking at the bars.

I am doing this in my Album Adapter, here's the code and hopefully someone can guide me in the right direction.

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;
}

}

解决方案

When you create your Palette, you should save it to your ViewHolder in the callback. Apart from Palette being expensive to create, this always keeps your Palette instances in sync with the grid item being handled as you bind the data from the ViewHolder.

EDIT: As requested, a sort-of example. I didn't have a computer with the SDK handy, so this is from memory, but it should get you going in the right direction!

    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());
        }
    }
}

这篇关于使用调色板的GridView故障的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆