如何将布尔值从片段传递到适配器
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})
至此,不需要界面。
我有这个片段,其中有一个开关。我想要的是,当开关的状态设置为 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})
至此,不需要界面。