如何将布尔值从片段传递到适配器

How to pass a boolean from fragment to adapter

我有这个片段,其中有一个开关。我想要的是,当开关的状态设置为 false 时,回收站视图中的项目会改变颜色。问题是,我不确定如何将布尔值从我的片段传递到我的适配器。我试图通过一个界面这样做,但它似乎不起作用,无论开关处于什么状态,颜色一直在变化。

这是片段中的部分:

private Boolean switchState = false;

@Override
public boolean getClicked() {
    if(switchState) {
        return false;
    }
    return true;
}

适配器中的部分(将接口传递给 class 和所有内容后):

interface ClickHere {
    val clicked: Boolean
}
//inside the viewholder that has the bind function
 if(clickHere.clicked){
    faceImage.alpha = 0.5F                     
    faceName.setTextColor(resources.getColor(R.color.disabled))
    } else {
      faceImage.alpha = 1F
      faceName.setTextColor(resources.getColor(R.color.content_1))
}

到目前为止,无论开关如何,回收器的运行似乎都好像 clickHere.clicked 始终为真。我怎样才能让它听取我片段中的布尔值?

评论中建议的带有变量的替代方案,但仍然无法正常工作: ViewHolder 内部 class 和绑定函数。

var adapterVariable = myAdapter(listener,displayMetrics)
if(adapterVariable.colored{    
    faceImage.alpha = 0.5F                     
    faceName.setTextColor(resources.getColor(R.color.disabled))
    } else {
      faceImage.alpha = 1F
      faceName.setTextColor(resources.getColor(R.color.content_1))
}

片段中:

myAdapter adapter = new myAdapter(this, getContext().getResources().getDisplayMetrics());
binding.facialSwitch.setOnClickListener(view -> {
    if(switchState){
        turnSwitchOff();
        adapter.setColored(switchState);
    } else {
        turnSwitchOn();
        adapter.setColored(false);
    }
});

在您的适配器内部,您可以使用匹配的 getter 和 setter 函数实例化一个私有布尔变量。然后在您的 viewhholder 创建中使用此变量。确保您在 setter 方法中调用 notifyDataSetChanged。否则,您的项目将不会被重新绘制,因此不会更新它们的颜色。

你可以这样做:

var colored = false
    set(value) {
        field = value
        this.notifyDataSetChanged()
    }

添加这些后,向您的交换机添加一个侦听器,它会调用适配器的新设置功能。确保将适配器保存为片段中的变量。

这是通过以下方式实现的:

var adapter: MyAdapter // create in onCreateView, save in your fragment
var switch: Switch // get from your UI
switch.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener{ _, isChecked ->
        adapter.colored = isChecked})

至此,不需要界面。