滚动后 recyclerview 项目更改按钮样式
recyclerview item changes button style after scroll
我有一个包含简单项目的 recyclerview - 一个项目有一个图像、标题和一个按钮。当用户单击按钮时,它需要更改其布局 -> 指示单击按钮(类似于复选框功能)。
问题是当我点击一个按钮时,例如第二个项目,当我滚动时它的行为很奇怪 - 多个项目被切换或原始项目未被切换。您可以在此处查看图片:
GIF PREVIEW
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
holder.button.setOnClickListener(view -> {
toggleButtonStyle((Button)view);
});
}
public void toggleButtonStyle(Button toggle)
{
Context ctx = toggle.getContext();
if (toggle.isActivated()) {
toggle.setActivated(false);
toggle.setBackground(ContextCompat.getDrawable(ctx, R.drawable.btn_purple_corners));
toggle.setTextColor(ContextCompat.getColor(ctx, R.color.purple_light));
} else {
toggle.setActivated(true);
toggle.setBackground(ContextCompat.getDrawable(ctx, R.drawable.btn_purple));
toggle.setTextColor(ContextCompat.getColor(ctx, R.color.white));
}
}
我过去也有过一些奇怪的行为。
对我来说,只需调用
即可解决
toggle.invalidate();
在你的 if/else 街区之后。这会强制重绘。试试看,我也很惊讶,这为我解决了它。
查看我的代码
@Override
public void onBindViewHolder(GifGridAdapter.ViewHolder holder, final int position) {
final DataModel model = arrayList.get(position);
if (model.isToggle()) {
//Code for changing the button background color and text color
} else {
//Code for changing the button background color and text color
}
holder.ivGif.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
model.setToggle(!model.isToggle());
notifyDataSetChanged();
}
});
}
您需要为onBindView 方法指定位置,因为它被调用了多次。如果您使用的是 AutoValue 不可变类型,则可以尝试创建一个布尔数组,您将在其中存储切换状态 (true/false)。然后在 onBindViewMethod 中检查当前位置的值并设置按钮样式。
private boolean[] toggledChoices = new boolean[yourListWithItems.size()];
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (toggledChoices[position]) {
toggleButtonStyle(true, holder.toggleButton);
} else {
toggleButtonStyle(false, holder.toggleButton;
}
holderVote.bToggleItem.setOnClickListener(v -> {
if (!toggledChoices[position]) {
toggledChoices[position] = true;
} else {
toggledChoices[position] = false;
}
});
}
我有一个包含简单项目的 recyclerview - 一个项目有一个图像、标题和一个按钮。当用户单击按钮时,它需要更改其布局 -> 指示单击按钮(类似于复选框功能)。
问题是当我点击一个按钮时,例如第二个项目,当我滚动时它的行为很奇怪 - 多个项目被切换或原始项目未被切换。您可以在此处查看图片:
GIF PREVIEW
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
holder.button.setOnClickListener(view -> {
toggleButtonStyle((Button)view);
});
}
public void toggleButtonStyle(Button toggle)
{
Context ctx = toggle.getContext();
if (toggle.isActivated()) {
toggle.setActivated(false);
toggle.setBackground(ContextCompat.getDrawable(ctx, R.drawable.btn_purple_corners));
toggle.setTextColor(ContextCompat.getColor(ctx, R.color.purple_light));
} else {
toggle.setActivated(true);
toggle.setBackground(ContextCompat.getDrawable(ctx, R.drawable.btn_purple));
toggle.setTextColor(ContextCompat.getColor(ctx, R.color.white));
}
}
我过去也有过一些奇怪的行为。 对我来说,只需调用
即可解决toggle.invalidate();
在你的 if/else 街区之后。这会强制重绘。试试看,我也很惊讶,这为我解决了它。
查看我的代码
@Override
public void onBindViewHolder(GifGridAdapter.ViewHolder holder, final int position) {
final DataModel model = arrayList.get(position);
if (model.isToggle()) {
//Code for changing the button background color and text color
} else {
//Code for changing the button background color and text color
}
holder.ivGif.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
model.setToggle(!model.isToggle());
notifyDataSetChanged();
}
});
}
您需要为onBindView 方法指定位置,因为它被调用了多次。如果您使用的是 AutoValue 不可变类型,则可以尝试创建一个布尔数组,您将在其中存储切换状态 (true/false)。然后在 onBindViewMethod 中检查当前位置的值并设置按钮样式。
private boolean[] toggledChoices = new boolean[yourListWithItems.size()];
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (toggledChoices[position]) {
toggleButtonStyle(true, holder.toggleButton);
} else {
toggleButtonStyle(false, holder.toggleButton;
}
holderVote.bToggleItem.setOnClickListener(v -> {
if (!toggledChoices[position]) {
toggledChoices[position] = true;
} else {
toggledChoices[position] = false;
}
});
}