Дублированные карточки в verticalGridView - PullRequest
0 голосов
/ 11 марта 2020

У меня здесь странная проблема.

Контекст:

Я создаю Android ТВ-приложение, которое использует библиотеку Leanback Android. Когда пользователь переходит к шоу, у него есть вертикальная сетка, в которой перечислены все эпизоды шоу.

Список заполняется с использованием ArrayObjectAdapter, которому я передаю episodeModel для каждого эпизода в списке, а затем просто устанавливаю адаптер для вида, используя setAdapter(adapter) Пока все хорошо.

Дело в том, что когда пользователь прокручивает список, элементы, которые не видны в области просмотра, обновляются, но с изображениями и названиями тех, которые уже были переданы. Я имею в виду, они выглядят как дублированные элементы, но на самом деле происходит то, что последние элементы обновляются не с собственными изображениями и заголовками, а с первыми.

Как мне предотвратить это?

Вот CardPresenter

public class CardPresenter extends Presenter {
    private static final String TAG = CardPresenter.class.getSimpleName();

    private static final int CARD_WIDTH = 420;
    private static final int CARD_HEIGHT= 236;
    private static int selectedBgColor;
    private static int defaultBgColor;
    private Drawable defaultCardimage;
    private ImageCardView mCardView;

    static class ViewHolder extends Presenter.ViewHolder{
        ViewHolder(View view) {
            super(view);
        }
    }

    private static void updateCardBGColor(ImageCardView view, boolean selected){
        int color = selected ? selectedBgColor : defaultBgColor;
        view.setBackgroundColor(color);
        view.findViewById(R.id.info_field).setBackgroundColor(color);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) {
        defaultBgColor = ContextCompat.getColor(parent.getContext(), R.color.le_gray);
        selectedBgColor = ContextCompat.getColor(parent.getContext(), R.color.le_black);

        defaultCardimage = ContextCompat.getDrawable(parent.getContext(), R.drawable.default_bg);

        mCardView = new ImageCardView(parent.getContext()) {
            @Override
            public void setSelected(boolean selected) {
                super.setSelected(selected);
                updateCardBGColor(this, selected);
            }
        };
        mCardView.setMainImage(defaultCardimage);
        mCardView.setFocusable(true);
        mCardView.setFocusableInTouchMode(true);
        mCardView.setCardType(BaseCardView.CARD_TYPE_INFO_UNDER);

        return new ViewHolder(mCardView);
    }

    @Override
    public void onBindViewHolder(Presenter.ViewHolder viewHolder, Object item) {
        if(item instanceof ShowModel){
            ShowModel showModel = (ShowModel) item;
            if(showModel.getThumbnail() != null){
                mCardView.setTitleText(showModel.getName());
                mCardView.setContentText(showModel.getType());
                mCardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT);
                Glide.with(viewHolder.view.getContext()).load(showModel.getThumbnail()).error(defaultCardimage).into(mCardView.getMainImageView());
            }
        }else if(item instanceof EpisodeModel){
            EpisodeModel episodeModel = (EpisodeModel) item;
            if(episodeModel.getStill() != null){
                mCardView.setTitleText(episodeModel.getTitle());
                mCardView.setContentText(episodeModel.getDescription());
                mCardView.setMainImageDimensions(CARD_WIDTH, CARD_HEIGHT);
                Glide.with(viewHolder.view.getContext()).load(episodeModel.getStill()).error(defaultCardimage).into(mCardView.getMainImageView());
            }
        }
    }

    @Override
    public void onUnbindViewHolder(Presenter.ViewHolder viewHolder) {
        mCardView.setBadgeImage(null);
        mCardView.setMainImage(null);
    }

}

enter image description here

1 Ответ

0 голосов
/ 17 марта 2020

Вам необходимо обновить onBindViewHolder, чтобы использовать ViewHolder для обновления представлений. Прямо сейчас вы создаете ссылку на то, что ImageCardView был создан последним, а затем обновляете его. Например, у вас есть

mCardView.setTitleText(showModel.getName());

Но mCardView не обязательно для правильной позиции. Вам нужно сделать что-то вроде этого:

viewHolder.itemView.setTitleText(showModel.getName());

Возможно, вам придется преобразовать itemView в ImageCardView.

...