Android 切换按钮组合
Android ToggleButton Combination
我正在使用 3 个 ToggleButtons(A、B、C)来过滤数组的内容(使用 AND 条件)并在列表视图中显示结果。
例如
如果 A 为真而 B、C 为假...列表视图将只显示数组中仅包含 A 的项目。如果 A、B 为真而 C 为假。列表视图将使用 A 和 B 显示我的数组中的项目。
我正在使用 onCheckedChangeListener 执行此操作,例如:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
List<BrandPlanners> filteredList = new ArrayList<>();
if (isChecked){
if (buttonView == A) {
if (B.isChecked()){
if (C.isChecked()){
//show listview with A,B and C elements
} else {
// show listview with A AND B elements
}
} else {
if (C.isChecked()){
// Show listview with A and C elements
} else {
// Show listview with A elements
}
}
}
if (buttonView == B) {
if (A.isChecked()){
if (C.isChecked()){
// show listview with 3 elements
} else {
// show listview whth A and B elements
}
} else {
if (C.isChecked()){
// show listview with C and B elements
} else {
// show listview with B elements
}
}
}
if (buttonView == C) {
if (A.isChecked()){
if (B.isChecked()){
// show 3 elements
} else {
// show C and A elements
}
} else {
if (B.isChecked()){
// show C and B elements
} else {
// show C elements
}
}
}
} else { //if isChecked() is false
//create all the if conditions again
}
}
我认为这不是一个好的做法,问题是:我怎样才能以更好的方式做到这一点?这确实有效,但我对代码不满意。
aCondition = ((buttonView == A && isChecked) || A.isChecked());
bCondition = ((buttonView == B && isChecked) || B.isChecked());
cCondition = ((buttonView == C && isChecked) || C.isChecked());
A.setVisibility(aCondition ? View.VISIBLE: View.GONE);
B.setVisibility(bCondition ? View.VISIBLE: View.GONE);
C.setVisibility(cCondition ? View.VISIBLE: View.GONE);
也可以短一点,像这样:
public void checkButton(Button buttonView, Button button){
button.setVisibility((buttonView == button && isChecked) || button.isChecked() ? View.VISIBLE: View.GONE);
}
checkButton(buttonView, A);
checkButton(buttonView, B);
checkButton(buttonView, C);
顺便说一句,我建议您不要使用首字母大写的变量(如 A、B 或 C),因为它们通常是常量或 class 名称。
使您的适配器实现 Filterable
。检查 Documentation.
关于代码,为 returns 位图(单个 char
可以工作)的每一行添加一个方法,并添加有关将 A、B 或 C 关联到单个位的信息.
例如:A 的第 0 位,B 的第 1 位和 C 的第 2 位
所以 0x01
意味着该行有 A 但没有 B 也没有 C
你写的整个代码会像
一样简单
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
char filter = 0x00;
filter += A.isChecked() ? 1 : 0;
filter += B.isChecked() ? 2 : 0;
filter += C.isChecked() ? 4 : 0;
for each element (
if (element.getObjectsAsBits() == filter)
show(element);
)
}
P.D。我知道代码不起作用。这只是伪代码,所以你明白了
我正在使用 3 个 ToggleButtons(A、B、C)来过滤数组的内容(使用 AND 条件)并在列表视图中显示结果。
例如 如果 A 为真而 B、C 为假...列表视图将只显示数组中仅包含 A 的项目。如果 A、B 为真而 C 为假。列表视图将使用 A 和 B 显示我的数组中的项目。
我正在使用 onCheckedChangeListener 执行此操作,例如:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
List<BrandPlanners> filteredList = new ArrayList<>();
if (isChecked){
if (buttonView == A) {
if (B.isChecked()){
if (C.isChecked()){
//show listview with A,B and C elements
} else {
// show listview with A AND B elements
}
} else {
if (C.isChecked()){
// Show listview with A and C elements
} else {
// Show listview with A elements
}
}
}
if (buttonView == B) {
if (A.isChecked()){
if (C.isChecked()){
// show listview with 3 elements
} else {
// show listview whth A and B elements
}
} else {
if (C.isChecked()){
// show listview with C and B elements
} else {
// show listview with B elements
}
}
}
if (buttonView == C) {
if (A.isChecked()){
if (B.isChecked()){
// show 3 elements
} else {
// show C and A elements
}
} else {
if (B.isChecked()){
// show C and B elements
} else {
// show C elements
}
}
}
} else { //if isChecked() is false
//create all the if conditions again
}
}
我认为这不是一个好的做法,问题是:我怎样才能以更好的方式做到这一点?这确实有效,但我对代码不满意。
aCondition = ((buttonView == A && isChecked) || A.isChecked());
bCondition = ((buttonView == B && isChecked) || B.isChecked());
cCondition = ((buttonView == C && isChecked) || C.isChecked());
A.setVisibility(aCondition ? View.VISIBLE: View.GONE);
B.setVisibility(bCondition ? View.VISIBLE: View.GONE);
C.setVisibility(cCondition ? View.VISIBLE: View.GONE);
也可以短一点,像这样:
public void checkButton(Button buttonView, Button button){
button.setVisibility((buttonView == button && isChecked) || button.isChecked() ? View.VISIBLE: View.GONE);
}
checkButton(buttonView, A);
checkButton(buttonView, B);
checkButton(buttonView, C);
顺便说一句,我建议您不要使用首字母大写的变量(如 A、B 或 C),因为它们通常是常量或 class 名称。
使您的适配器实现 Filterable
。检查 Documentation.
关于代码,为 returns 位图(单个 char
可以工作)的每一行添加一个方法,并添加有关将 A、B 或 C 关联到单个位的信息.
例如:A 的第 0 位,B 的第 1 位和 C 的第 2 位
所以 0x01
意味着该行有 A 但没有 B 也没有 C
你写的整个代码会像
一样简单public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
char filter = 0x00;
filter += A.isChecked() ? 1 : 0;
filter += B.isChecked() ? 2 : 0;
filter += C.isChecked() ? 4 : 0;
for each element (
if (element.getObjectsAsBits() == filter)
show(element);
)
}
P.D。我知道代码不起作用。这只是伪代码,所以你明白了