android - 使用不同的卡片样式滚动时,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。
解决方案
ViewHolders 被重用。这意味着您需要设置您可能修改的每个属性。View.GONE
如果您设置为永远不会再次设置为可见的所有视图,如果它们被重复用于不同的项目类型。
正如luca_999所指出的,您还可以将 ViewTypes 用于此答案中所述的行为。当您的绑定代码在类型之间更改或需要扩展不同布局时变得昂贵时,这会更有效。
推荐阅读
- python - 如何修复 Pylint 的误报无法导入错误?
- python - 如何替换字典中所有键的第一个字符?
- python - 如何在 Python 中的 pandas 数据帧上使用 groupby 创建多个列表聚合?
- react-native - 成功扫描生物识别反应本机指纹扫描仪无法进入下一个屏幕?
- omnet++ - 有没有办法将多个 TraCI 模块连接到 OMNet++/veins 仿真?
- python - 在 Spyder 中导入 Flasgger:ModuleNotFoundError: No module named 'flasgger'
- laravel - laravel 8 -> 使用 jwt 和邮递员授权
- python - s3上传后未触发Lambda函数
- node.js - Node中的数据库连接是异步的吗?
- amazon-web-services - 如何在 AWS 中通过 https 将裸网址重定向到 www?