API палитры не работает (работает только при отладке) - PullRequest
0 голосов
/ 16 февраля 2019

Я создал простой RecyclerView и CardView в нем.В CardView есть ImageView и TextView.Таким образом, я получаю URL изображения и загружаю его, используя Picasso.Все работало хорошо перед использованием Palette API.Поэтому я хочу получить цвет из изображения и установить его на CardView и TextView.

Вот мой RecyclerView.Adapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

    private List<String> imagesUrl;
    private List<String> imageDescription;

    RecyclerAdapter(List<String> imagesUrl, List<String> imageDescription) {
        this.imagesUrl = imagesUrl;
        this.imageDescription = imageDescription;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
        myViewHolder.textView.setText(imageDescription.get(position));
        Picasso.get()
                .load(imagesUrl.get(position))
                .into(new Target() {
                    @Override
                    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                        myViewHolder.imageView.setImageBitmap(bitmap);
                        myViewHolder.getPalette();
                    }

                    @Override
                    public void onBitmapFailed(Exception e, Drawable errorDrawable) {
                        myViewHolder.imageView.setImageResource(R.drawable.error);
                    }

                    @Override
                    public void onPrepareLoad(Drawable placeHolderDrawable) {
                        myViewHolder.imageView.setImageResource(R.drawable.placeholder);
                    }
                });
    }

    @Override
    public int getItemCount() {
        return imagesUrl.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;
        private TextView textView;
        private CardView cardView;

        MyViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
            textView = itemView.findViewById(R.id.textView);
            cardView = itemView.findViewById(R.id.cardView);
        }

        private void getPalette() {
            Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
            Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
                @Override
                public void onGenerated(@Nullable Palette palette) {
                    //assert palette != null;
                    Palette.Swatch swatch = palette.getVibrantSwatch();
                    //assert swatch != null;
                    textView.setTextColor(swatch.getBodyTextColor());
                    cardView.setCardBackgroundColor(swatch.getRgb());
                }
            });
        }
    }
}

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

1 Ответ

0 голосов
/ 16 февраля 2019

Так что проблема не в Palette API.Проблема в том, что цель - сборщик мусора. Поэтому решение состоит в том, чтобы реализовать его на объекте или сохранить в поле и установить его в качестве тега для нашего ImageView.

Здесь.Это сейчас работает.

@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
    myViewHolder.textView.setText(imageDescription.get(position));
    Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            myViewHolder.imageView.setImageBitmap(bitmap);
            myViewHolder.getPalette();
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            myViewHolder.imageView.setImageResource(R.drawable.error);
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            myViewHolder.imageView.setImageResource(R.drawable.placeholder);
        }
    };

    Picasso.with(context)
            .load(imagesUrl.get(position))
            .into(target);

    myViewHolder.imageView.setTag(target);
}

Думаю, это когда-нибудь кому-нибудь поможет))) Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...