我有一个带有简单物品的recyclerview - 一个物品有一个图像,标题和一个按钮。当用户点击按钮时,它需要更改其布局 - >表示单击了该按钮(类似于复选框功能)。
问题是,当我点击一个按钮,例如第二个项目时,当我滚动时,它表现得很奇怪 - 多个项目被切换或原始项目被取消。您可以在此处查看图片:
@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));
}
}
答案 0 :(得分:0)
I had some strange behavior too in the past. For me it was solved by simply calling
toggle.invalidate();
after your if/else block. This forces the redraw. Try it, I was surprised too, that this fixed it for me.
答案 1 :(得分:0)
查看我的代码
@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();
}
});
}
答案 2 :(得分:0)
您需要为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;
}
});
}