У меня здесь странная проблема.
Контекст:
Я создаю 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);
}
}