java - RecyclerView 项目内容混淆

标签 java android xml android-recyclerview

我有一个 RecyclerView,其中包含具有交互式内容的项目。 每个项目都包含一个每 5 秒更新一次的 TextView ,但是当 RecyclerView 中的项目超过 5 个时,数据就会混淆。

举例:

正确: | 1 - 100 |

| 2 - 283 |

| 3 - 382 |

当它混淆时:

| 2 - 283 |

| 1 - 100 |

| 3 - 382 |

有点像,只是混在一起了。

当我调用 de adapter.notifyDataSetChanged() 时会发生这种情况;

我的适配器:

公共(public)类 FavoritesAdapter 扩展 RecyclerView.Adapter {

private List<Favorites> channels;
private Context context;

public FavoritesAdapter(Context context, List<Favorites> channels) {
    this.context = context;
    this.channels = channels;
}

@Override
public FavoritesViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.favoriteitem_layout, viewGroup, false);
    FavoritesViewHolder pvh = new FavoritesViewHolder(v);
    return pvh;
}

@Override
public void onBindViewHolder(final FavoritesViewHolder holder, final int position) {
    final DBHelper dbHelper = new DBHelper(context);
    if (Data.isConnected(context)) {
        Scheduler.getInstance().doAsync(new Scheduler.Task<Object, Channel>() {
            @Override
            public Channel run(Object... params) {
                return Methods.getData(channels.get(position).getChannelId(), channels.get(position).getChannelName(), true, context);
            }
        }, new Scheduler.Executable<Channel>() {
            @Override
            public void execute(Channel result) {

                if(result.getId() != "") {
                    if(!result.channelSubs.equalsIgnoreCase("-500_RTSS_ERROR")) {
                        holder.channelSubsView.setText(result.getSubs());
                        holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers");
                        channels.get(position).setChannelSubs(result.getSubs());
                        dbHelper.updateFavorites(channels.get(position));
                    }
                    else {
                        holder.channelSubsView.setText(channels.get(position).getChannelSubs());
                        holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)");
                    }
                }
                else {
                    holder.channelSubsView.setText(channels.get(position).getChannelSubs());
                    holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)");
                }
            }
        });
    }
    else {
        holder.channelSubsView.setText(channels.get(position).getChannelSubs());
        holder.channelTitleSubsView.setText(String.valueOf(channels.get(position).getChannelName()) + "'s Suscribers (Cached)");
    }

    Picasso.with(context).load(channels.get(position).getChannelAvatar())
            .error(R.drawable.youtube_default_avatar)
            .placeholder(R.drawable.youtube_default_avatar)
            .into(holder.channelAvatarView);

    holder.channelCardView.setOnClickListener(clickListener);
    holder.channelCardView.setTag(holder);
}

View.OnClickListener clickListener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        FavoritesViewHolder holder = (FavoritesViewHolder) view.getTag();
        int position = holder.getPosition();

        Favorites channel = channels.get(position);
        if(Data.isConnected(context)) {
            Methods.getYouTubeData(channel.getChannelId(), channel.getChannelName(), channel.getChannelAvatar(), context);
        }
        else {
            Toast.makeText(context, R.string.error_connection_no_internet, Toast.LENGTH_LONG).show();
        }
    }
};

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

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

public static class FavoritesViewHolder extends RecyclerView.ViewHolder {
    CardView channelCardView;
    TextView channelSubsView;
    TextView channelTitleSubsView;
    ImageView channelAvatarView;

    FavoritesViewHolder(View itemView) {
        super(itemView);
        channelCardView = (CardView) itemView.findViewById(R.id.channelCardView);
        channelSubsView = (TextView) itemView.findViewById(R.id.subsAmount);
        channelTitleSubsView = (TextView) itemView.findViewById(R.id.subsText);
        channelAvatarView = (ImageView) itemView.findViewById(R.id.channelAvatarView);
    }
}

最佳答案

您正在 onBindViewHolder 中进行 asynchronous 调用,因此当异步任务的响应到来时,它从 读取错误位置public void onBindViewHolder(final FavoritesViewHolder holder, final int position) 因为到那时 onBindViewHolder 返回的位置已经改变

您可以做的是,将位置作为参数传递给async task,并在async task 的结果中传递相同的位置。这样,对位置 p 的调用(例如)将应用于 p

除此之外,还尝试在 RecyclerViewHolder 上使用 getAdapterPosition 而不是 getPosition(已弃用并造成混淆)。

关于java - RecyclerView 项目内容混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36592013/

相关文章:

android - retrofit 2.0如何忽略json对象动态响应的key

android - java.lang.NoClassDefFoundError : Failed resolution of: Lorg/apache/commons/logging/LogFactory 错误

c# - "ADD"从 XML 文件到 DataGridView

xml - DateTime.Now 持续时间 +- 2 小时?

java - 当我们使用自己的线程池时,netty可以线程安全吗?如果netty可以,为什么?

java - 映射 Java ArrayList<CustomClass> 和 Flex ArrayCollection

java - 基于文本文件的火灾事件

android - 将图像从 JSON 解析为 Android 中的 ListView

java - Angular 客户端向 Java 服务器发送 POST 请求的参数

java - SAX 查找最大深度的节点