首页 > 解决方案 > 使用不同的卡片样式滚动时,recyclerView 会混淆

问题描述

我有一个 recyclerview,它提供了一张卡片列表。所有卡片都基于相同的 XML 文件,但根据从 JSON 接收的数据,卡片的某些部分是隐藏的(一些包括图像、一些图像和文本、一些日期等。

recyclerview脚本如下:

public class FeedRecyclerViewAdapter extends RecyclerView.Adapter<FeedRecyclerViewAdapter.ViewHolder>  {
private Context context;
private List<FeedItem> feedList;

public FeedRecyclerViewAdapter(Context context, List<FeedItem> feedList) {
    this.context = context;
    this.feedList = feedList;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.feed_card, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    String imageUrl;

    FeedItem feedItem = feedList.get(i);
    String feedType = feedItem.getItemType();

    if (feedType.equals("video")) {
        viewHolder.feedDate.setText(feedItem.getItemDate());
        viewHolder.feedTitle.setText(feedItem.getItemTitle());
        viewHolder.feedText.setText(feedItem.getItemText());

        Picasso.get().load(feedItem.getItemLink()).into(viewHolder.feedPhoto);
    } else if (feedType.equals("photo")) {

        viewHolder.feedDate.setVisibility(View.GONE);
        viewHolder.feedTitle.setVisibility(View.GONE);
        viewHolder.feedText.setVisibility(View.GONE);

        Picasso.get().load(feedItem.getItemLink()).into(viewHolder.feedPhoto);
    } else if (feedType.equals("blog")) {

        viewHolder.feedDate.setVisibility(View.GONE);
        viewHolder.feedTitle.setText(feedItem.getItemTitle());
        viewHolder.feedText.setText(feedItem.getItemText());

        Picasso.get().load(feedItem.getItemLink()).into(viewHolder.feedPhoto);
    }
}

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

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public TextView feedDate, feedTitle, feedText;
    public ImageView feedPhoto;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        

        feedDate = itemView.findViewById(R.id.feedDate);
        feedTitle = itemView.findViewById(R.id.feedTitle);
        feedText = itemView.findViewById(R.id.feedText);
        feedPhoto = itemView.findViewById(R.id.feedPhoto);
    }

    
}
}

提要正确加载,但是当我开始滚动时,我注意到卡片中的某些项目消失了,就像它会显示图像而不是文本一样,当我向上滚动时,它又会发生变化。

我相信我没有在 onBindViewHolder 中正确设置内容,但不确定如何以正确的方式进行操作。

我正在使用 Java 开发 Android Studio 4.1。

标签: androidandroid-recyclerview

解决方案


ViewHolders 被重用。这意味着您需要设置您可能修改的每个属性。View.GONE如果您设置为永远不会再次设置为可见的所有视图,如果它们被重复用于不同的项目类型。

正如luca_999所指出的,您还可以将 ViewTypes 用于此答案中所述的行为。当您的绑定代码在类型之间更改或需要扩展不同布局时变得昂贵时,这会更有效。


推荐阅读