verticalGridView 中的重复卡片

Duplicated cards in verticalGridView

我这里有一个奇怪的问题。

上下文:

我正在构建一个 Android 电视应用程序,它使用 Android 的 Leanback 库。当用户导航到一个节目时,它有一个垂直网格视图,其中列出了该节目的所有剧集。

列表使用 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);
    }

}

您需要更新 onBindViewHolder 才能使用 ViewHolder 更新视图。现在您正在创建对最近创建的 ImageCardView 的引用,然后更新它。例如,您有

mCardView.setTitleText(showModel.getName());

但是mCardView不一定是对的位置。你需要做这样的事情:

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

您可能需要将 itemView 转换为 ImageCardView。