gpt4 book ai didi

java - 更改一个 ViewHolder 项目也会影响其他项目

转载 作者:行者123 更新时间:2023-12-04 01:45:40 27 4
gpt4 key购买 nike

我有一个基于 的简单 mp3 播放器回收站查看 .
有一个适配器 浏览器 用于处理播放列表中的轨道。

public class TracksAdapter extends RecyclerView.Adapter<TracksAdapter.ViewHolder> {

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.cell_playlist, parent, false);

return new ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

holder.trackName.setText("Track " + position);
}

@Override
public int getItemCount() {

return tracks.size();
}

class ViewHolder extends RecyclerView.ViewHolder {

final TextView trackName;

ViewHolder(View itemView) {

super(itemView);

trackName = itemView.findViewById(R.id.trackName);
}
}
}

当我单击轨道时,我想更改播放列表中所选轨道的背景颜色。问题是当我将背景颜色设置为一个项目时,它将影响播放列表中的每十个单元格。

例如,如果播放列表中有 100 首轨道,则将突出显示 10 首轨道,包括所选轨道。

方法 findViewHolderForAdapterPosition(位置) 返回带有所选轨道的 ViewHolder。
private void setTrackColor(int position) {

RecyclerView.ViewHolder holder =
recyclerView.findViewHolderForAdapterPosition(position);

if (holder == null) return;

View item = holder.itemView;
item.setBackgroundColor(ContextCompat.getColor(main, R.color.playing));
}

最佳答案

您不能直接更改 View 的颜色。在 RecyclerView , 所有 Views被重复使用。因此,如果您更改某个位置的颜色,您可能会间接更改其他位置的颜色,因为将重复使用相同的 View 。

您必须单独保存当前播放轨道的位置。这样,在 onBindViewHolder 期间,您检查当前正在绑定(bind)的 View 是否是当前正在播放的轨道。如果它是相同的轨道,请应用一些颜色。如果不是同种颜色,恢复默认颜色

public class TracksAdapter extends RecyclerView.Adapter<TracksAdapter.ViewHolder> {

private int mTrackPlaying = -1;

public void setTrackPlaying(int position) {
mTrackPlaying = position;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.trackName.setText("Track " + position);
if(position == mTrackPlaying) {
holder.itemView.setBackgroundColor(ContextCompat.getColor(main, R.color.playing));
} else {
// Here, you must restore the color because the view is reused.. so, you may receive a reused view with wrong colors
holder.itemView.setBackgroundColor(ContextCompat.getColor(main, R.color.NOT_playing));
}
}
}

接着
private void setTrackColor(int position) {
TracksAdapter adapter = (TracksAdapter) recyclerView.getAdapter();
adapter.setTrackPlaying(position);
// Line below will `RecyclerView` to re-draw that position.. in other words, it will triggers a call to `onBindViewHolder`
adapter.notifyItemChanged(position);

// Reset the color of song previously playing..
adapter.notifyItemChanged(oldPosition);
}

关于java - 更改一个 ViewHolder 项目也会影响其他项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285596/

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