android - Recyclerview 项目按钮动画发生在多个项目上
问题描述
所以我有一个非常简单的回收站视图。和一个应用按钮。当它按下按钮时,文本变为橙色。但是当我向下滚动时,我看到还有其他项目的应用按钮颜色也已更改。
有谁知道发生了什么?这里有一些代码片段。
public void apply(View view){
Button b = (Button)view;
b.setTextColor(ColorEx.TUTOR_BEAR_LOGO_ORANGE);
}
这就是在主要活动中执行的方法。这是不同布局的按钮 xml。(项目布局)
<Button
android:id="@+id/btn_apply"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="APPLY"
android:onClick="apply"
/>
这是我的适配器类
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
Context context;
ArrayList<String> title;
public Adapter(Context context, ArrayList<String> title) {
this.context = context;
this.title = title;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.item_sample,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
switch (position){
case 0:
case 3:
case 6:
holder.imageView.setImageResource(R.drawable.x);
break;
case 1:
case 4:
case 7:
holder.imageView.setImageResource( R.drawable.y);
break;
case 2:
case 5:
holder.imageView.setImageResource(R.drawable.z);
break;
case 8:
holder.imageView.setImageResource(R.drawable.z);
break;
}
}
@Override
public int getItemCount() {
return title.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
}
}
}
我屏幕记录了该事件并将其上传为 .gif 以便更好地参考。这是下面的链接。 https://media.giphy.com/media/jOagjkf9dmW5Kvrqyn/giphy.gif
解决方案
您必须保存被点击的项目位置
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
Context context;
ArrayList<String> title;
Set<Integer> itemClicked;
public Adapter(Context context, ArrayList<String> title) {
this.context = context;
this.title = title;
this.itemClicked = new HashSet<>();
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.item_sample, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, final int position) {
switch (position) {
case 0:
case 3:
case 6:
holder.imageView.setImageResource(R.drawable.x);
break;
case 1:
case 4:
case 7:
holder.imageView.setImageResource(R.drawable.y);
break;
case 2:
case 5:
holder.imageView.setImageResource(R.drawable.z);
break;
case 8:
holder.imageView.setImageResource(R.drawable.z);
break;
}
if (itemClicked.contains(position)) {
holder.button.setTextColor(ColorEx.TUTOR_BEAR_LOGO_ORANGE);
} else {
holder.button.setTextColor(ColorEx.BLACK);
}
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (itemClicked.contains(position)) {
itemClicked.remove(position);
} else {
itemClicked.add(position);
}
notifyItemChanged(position);
}
});
}
@Override
public int getItemCount() {
return title.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
Button button;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageView);
button = itemView.findViewById(R.id.btn_apply);
}
}
}
推荐阅读
- apache-kafka - 使用 Docker Compose 创建 Kafka-Connect 集群以供 ksqlDB 使用
- python - Python从不同的列表中获取最大绝对值
- curl - android ndk + curl / localhost 文件下载问题
- c# - 在此上下文上启动了第二个操作,即使上下文声明为 trainsent
- android - Android D/DecorView: semSetRoundedCorners: 5 Infinite Log
- visual-studio-code - VS Code - 如何为工作区选择 Jupyter Kernel?
- javascript - 如何在 JavaScript 中同步使用 FileReader.readAsText 读取文件?
- python - 将列表转换为列名
- windows - 强制使用 Internet Explorer 打开启动器
- r - 从R中的全名中删除重复的名字