recyclelerview项目滚动后更改按钮样式

时间:2016-11-09 10:31:26

标签: android android-recyclerview android-viewholder

我有一个带有简单物品的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));
    }
}

3 个答案:

答案 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;
        }

    });
}