Android ToggleButton组合

时间:2015-08-21 15:17:32

标签: android listview if-statement togglebutton

我使用3个ToggleButtons(A,B,C)来过滤我的数组内容(带有AND条件),并在listview中显示结果。

例如 如果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
        }
    }

我认为这不是一个好习惯,问题是:我怎样才能以更好的方式做到这一点?这实际上是有效的,但我对代码不满意。

2 个答案:

答案 0 :(得分:2)

制作适配器工具Filterable。查看Documentation

关于代码,为每个返回位图的行添加一个方法(单个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);
    )
}

Pd积。我知道代码不起作用。它只是伪代码,所以你有了一个想法

答案 1 :(得分:0)

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),因为它们通常是或常量或类名。