gpt4 book ai didi

java - RecyclerView 项目内容混淆

转载 作者:行者123 更新时间:2023-12-04 18:00:10 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com