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。
我这里有一个奇怪的问题。
上下文:
我正在构建一个 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。