Android 微调器的逐步选择取决于选定的值

Android 微调器的逐步选择取决于选定的值,android,android-spinner,Android,Android Spinner,我有3个纺纱机,像那样互相依赖 类别1 类别2 类别3 当用户选择Category1时,2.spinner应显示该类别 类别1-1 类别1-2 类别1-3 和用户选择类别1-2,3。微调器应显示 类别1-1-1 类别1-1-2 类别1-1-3 我是这样实现的,但是太长了 因此,我想听听关于更高效代码的任何建议 你可以这样重构它。它仍然很长,因为它的一部分可以概括,但它更可读 图书活动 public class BookActivity extends AppCompatActivity {

我有3个纺纱机,像那样互相依赖

类别1 类别2 类别3 当用户选择Category1时,2.spinner应显示该类别

类别1-1 类别1-2 类别1-3 和用户选择类别1-2,3。微调器应显示

类别1-1-1 类别1-1-2 类别1-1-3 我是这样实现的,但是太长了

因此,我想听听关于更高效代码的任何建议


你可以这样重构它。它仍然很长,因为它的一部分可以概括,但它更可读

图书活动

public class BookActivity extends AppCompatActivity {
    Spinner sp1, sp2, sp3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        sp1 = (Spinner) findViewById(R.id.sp1);
        sp2 = (Spinner) findViewById(R.id.sp2);
        sp3 = (Spinner) findViewById(R.id.sp3);

        initSpinner1();
    }

    private void initSpinner1() {
        final List<String> list = new ArrayList<>();
        list.add("Category1");
        list.add("Category2");
        list.add("Category3");

        initSpinner(sp1, list, new SpinnerListener.Callback() {
            @Override
            public void onResult(String itemName) {
                initSpinner2(itemName);
            }
        });
    }

    private void initSpinner2(String selectedCategory) {
        final List<String> list = new ArrayList<>();
        switch (selectedCategory) {
            case "Category1":
                list.add("Category1-1");
                list.add("Category1-2");
                list.add("Category1-3");
                break;
            case "Category2":
                list.add("Category2-1");
                list.add("Category2-2");
                list.add("Category2-3");
                break;
            case "Category3":
                list.add("Category3-1");
                list.add("Category3-2");
                list.add("Category3-3");
                break;
            default:
                break;
        }

        initSpinner(sp2, list, new SpinnerListener.Callback() {
            @Override
            public void onResult(String itemName) {
                initSpinner3(itemName);
            }
        });
    }

    public void initSpinner3(String selectedCategory) {
        final List<String> list = new ArrayList<>();
        switch (selectedCategory) {
            case "Category1-1":
                list.add("Category1-1-1");
                list.add("Category1-1-2");
                list.add("Category1-1-3");
                break;
            case "Category1-2":
                list.add("Category1-2-1");
                list.add("Category1-2-2");
                list.add("Category1-2-3");
                break;
            case "Category1-3":
                list.add("Category1-3-1");
                list.add("Category1-3-2");
                list.add("Category1-3-3");
                break;
            default:
                break;
        }
        initSpinner(sp3, list, new SpinnerListener.Callback() {
            @Override
            public void onResult(String itemName) {
                // TODO
            }
        });
    }

    private void initSpinner(Spinner spinner, List<String> list, SpinnerListener.Callback callback) {
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
        spinner.setOnItemSelectedListener(listener);
    }
} 
可以这样写:

initSpinner(sp2, list, itemName -> initSpinner3(itemName));
甚至更短:

initSpinner(sp2, list, this::initSpinner3);
编辑

或者您可以通过使用字符串数组而不是列表来执行类似操作。您可以将初始化数组的方法导出到一个单独的文件中,以便使“活动”中的代码更轻松:

public class BookActivity extends AppCompatActivity {
    Spinner sp1, sp2, sp3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        sp1 = (Spinner) findViewById(R.id.sp1);
        sp2 = (Spinner) findViewById(R.id.sp2);
        sp3 = (Spinner) findViewById(R.id.sp3);

        initSpinner1();
    }

    private void initSpinner1() {
        final String[] list = SpinnerArrayInitializer.getSpinner1Array();
        initSpinner(sp1, list, itemName -> initSpinner2(itemName));
    }

    private void initSpinner2(String selectedCategory) {
        final String[] list = SpinnerArrayInitializer.getSpinner2Array(selectedCategory);
        initSpinner(sp2, list, itemName -> initSpinner3(itemName));
    }

    public void initSpinner3(String selectedCategory) {
        final String[] list = SpinnerArrayInitializer.getSpinner3Array(selectedCategory);
        initSpinner(sp3, list, itemName -> {
            // TODO
        });
    }

    private void initSpinner(Spinner spinner, String[] list, SpinnerListener.Callback
            callback) {
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
        spinner.setOnItemSelectedListener(listener);
    }
}
试试这个:

public class BookActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
private final static int SP1_NUM_OF_OPTIONS = 3;
private final static int SP2_NUM_OF_OPTIONS = 3;
private final static int SP3_NUM_OF_OPTIONS = 3;
private final static String SP3_HINT = "<SELECT>";

Spinner sp1, sp2, sp3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_book);
    sp1 = (Spinner) findViewById(R.id.sp1);
    sp2 = (Spinner) findViewById(R.id.sp2);
    sp3 = (Spinner) findViewById(R.id.sp3);

    // Setup data list and adapter for sp1.
    ArrayList<String> list = new ArrayList<>();
    for(int i=1; i<=SP1_NUM_OF_OPTIONS; i++){
        list.add("Category" + i);
    }
    ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    sp1.setAdapter(adapter);

    // Set listeners for all spinners.
    sp1.setOnItemSelectedListener(this);
    sp2.setOnItemSelectedListener(this);
    sp3.setOnItemSelectedListener(this);
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(this, "YOUR SELECTION IS : " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    fillSpinnerList(parent.getId(), parent.getItemAtPosition(position).toString());

    // Automatically do something different after last step is selected.
    if(parent.getId() == R.id.sp3){
        if(!parent.getItemAtPosition(position).toString().equals(SP3_HINT)){
            // Do something
        }
    }
}

@Override
public void onNothingSelected(AdapterView<?> parent) {}

public void fillSpinnerList(int spinnerId, String selectedSpinnerName){
    ArrayAdapter adapter;
    if(spinnerId == R.id.sp1){
        String[] list1;
        list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list1);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp2.setAdapter(adapter);
    }else if(spinnerId == R.id.sp2){
        ArrayList<String> list = new ArrayList<>();
        list.add(SP3_HINT);
        String[] list1;
        list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
        list.addAll(Arrays.asList(list1));
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp3.setAdapter(adapter);
    }
}
}
在strings.xml中添加您的类别:

    <array name="Category1">
    <item>Category1_1</item>
    <item>Two</item>
    <item>Three</item>
</array>
<array name="Category1_1">
    <item>Category1_1_1</item>
    <item>Category1_1_2</item>
    <item>Category1_1_3</item>
</array>
<array name="Two">
    <item>Category1_2_1</item>
    <item>Category1_2_2</item>
    <item>Category1_2_3</item>
</array>
<array name="Three">
    <item>Category1_3_1</item>
    <item>Category1_3_2</item>
    <item>Category1_3_3</item>
</array>

<array name="Category2">
    <item>Category2_1</item>
    <item>Four</item>
    <item>Five</item>
</array>
<array name="Category2_1">
    <item>Category2_1_1</item>
    <item>Category2_1_2</item>
    <item>Category2_1_3</item>
</array>
<array name="Four">
    <item>Category2_2_1</item>
    <item>Category2_2_2</item>
    <item>Category2_2_3</item>
    <item>Category2_2_4</item>
</array>
<array name="Five">
    <item>Category2_3_1</item>
    <item>Category2_3_2</item>
    <item>Category2_3_3</item>
    <item>Category2_3_4</item>
    <item>Category2_3_5</item>
</array>

<array name="Category3">
    <item>Category3_1</item>
    <item>Six</item>
    <item>Seven</item>
</array>
<array name="Category3_1">
    <item>Category3_1_1</item>
    <item>Category3_1_2</item>
    <item>Category3_1_3</item>
</array>
<array name="Six">
    <item>Category3_2_1</item>
    <item>Category3_2_2</item>
    <item>Category3_2_3</item>
    <item>Category3_2_4</item>
    <item>Category3_2_5</item>
    <item>Category3_2_6</item>
</array>
<array name="Seven">
    <item>Category3_3_1</item>
    <item>Category3_3_2</item>
    <item>Category3_3_3</item>
    <item>Category3_3_4</item>
    <item>Category3_3_5</item>
    <item>Category3_3_6</item>
    <item>Category3_3_7</item>
</array>

希望能有帮助

我选择第二种方法,因为您可以使数组尽可能大,但不会影响逻辑活动的大小。如果你的数组真的很大,也许应该使用一些不同的东西来存储数据,比如数据库解决方案是OK,但我的实际数据不是Category1,Category1-1名称彼此不同,但谢谢。编辑了答案[fillSpinnerList方法中的更改]!在strings.xml中,您可以更改spinner2的项目名称,但请确保也相应地更改了数组名称。
public class BookActivity extends AppCompatActivity {
    Spinner sp1, sp2, sp3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_book);
        sp1 = (Spinner) findViewById(R.id.sp1);
        sp2 = (Spinner) findViewById(R.id.sp2);
        sp3 = (Spinner) findViewById(R.id.sp3);

        initSpinner1();
    }

    private void initSpinner1() {
        final String[] list = SpinnerArrayInitializer.getSpinner1Array();
        initSpinner(sp1, list, itemName -> initSpinner2(itemName));
    }

    private void initSpinner2(String selectedCategory) {
        final String[] list = SpinnerArrayInitializer.getSpinner2Array(selectedCategory);
        initSpinner(sp2, list, itemName -> initSpinner3(itemName));
    }

    public void initSpinner3(String selectedCategory) {
        final String[] list = SpinnerArrayInitializer.getSpinner3Array(selectedCategory);
        initSpinner(sp3, list, itemName -> {
            // TODO
        });
    }

    private void initSpinner(Spinner spinner, String[] list, SpinnerListener.Callback
            callback) {
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        final AdapterView.OnItemSelectedListener listener = new SpinnerListener(this, callback);
        spinner.setOnItemSelectedListener(listener);
    }
}
public interface SpinnerArrayInitializer {

    static String[] getSpinner1Array() {
        return new String[]{"Category1", "Category2", "Category3"};
    }

    static String[] getSpinner2Array(String selectedCategory) {
        switch (selectedCategory) {
            case "Category1":
                return new String[]{"Category1-1", "Category1-2", "Category1-3"};
            case "Category2":
                return new String[]{"Category2-1", "Category2-2", "Category2-3"};
            case "Category3":
                return new String[]{"Category3-1", "Category3-2", "Category3-3"};
            default:
                return new String[0];
        }
    }

    static String[] getSpinner3Array(String selectedCategory) {
        switch (selectedCategory) {
            case "Category1-1":
                return new String[]{"Category1-1-1", "Category1-1-2", "Category1-1-3"};
            case "Category1-2":
                return new String[]{"Category1-2-1", "Category1-2-2", "Category1-2-3"};
            case "Category1-3":
                return new String[]{"Category1-3-1", "Category1-3-2", "Category1-3-3"};
            default:
                return new String[0];
        }
    }
}
public class BookActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
private final static int SP1_NUM_OF_OPTIONS = 3;
private final static int SP2_NUM_OF_OPTIONS = 3;
private final static int SP3_NUM_OF_OPTIONS = 3;
private final static String SP3_HINT = "<SELECT>";

Spinner sp1, sp2, sp3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_book);
    sp1 = (Spinner) findViewById(R.id.sp1);
    sp2 = (Spinner) findViewById(R.id.sp2);
    sp3 = (Spinner) findViewById(R.id.sp3);

    // Setup data list and adapter for sp1.
    ArrayList<String> list = new ArrayList<>();
    for(int i=1; i<=SP1_NUM_OF_OPTIONS; i++){
        list.add("Category" + i);
    }
    ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    sp1.setAdapter(adapter);

    // Set listeners for all spinners.
    sp1.setOnItemSelectedListener(this);
    sp2.setOnItemSelectedListener(this);
    sp3.setOnItemSelectedListener(this);
}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(this, "YOUR SELECTION IS : " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
    fillSpinnerList(parent.getId(), parent.getItemAtPosition(position).toString());

    // Automatically do something different after last step is selected.
    if(parent.getId() == R.id.sp3){
        if(!parent.getItemAtPosition(position).toString().equals(SP3_HINT)){
            // Do something
        }
    }
}

@Override
public void onNothingSelected(AdapterView<?> parent) {}

public void fillSpinnerList(int spinnerId, String selectedSpinnerName){
    ArrayAdapter adapter;
    if(spinnerId == R.id.sp1){
        String[] list1;
        list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list1);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp2.setAdapter(adapter);
    }else if(spinnerId == R.id.sp2){
        ArrayList<String> list = new ArrayList<>();
        list.add(SP3_HINT);
        String[] list1;
        list1 = getResources().getStringArray(getResources().getIdentifier(selectedSpinnerName, "array", getPackageName()));
        list.addAll(Arrays.asList(list1));
        adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp3.setAdapter(adapter);
    }
}
}
    <array name="Category1">
    <item>Category1_1</item>
    <item>Two</item>
    <item>Three</item>
</array>
<array name="Category1_1">
    <item>Category1_1_1</item>
    <item>Category1_1_2</item>
    <item>Category1_1_3</item>
</array>
<array name="Two">
    <item>Category1_2_1</item>
    <item>Category1_2_2</item>
    <item>Category1_2_3</item>
</array>
<array name="Three">
    <item>Category1_3_1</item>
    <item>Category1_3_2</item>
    <item>Category1_3_3</item>
</array>

<array name="Category2">
    <item>Category2_1</item>
    <item>Four</item>
    <item>Five</item>
</array>
<array name="Category2_1">
    <item>Category2_1_1</item>
    <item>Category2_1_2</item>
    <item>Category2_1_3</item>
</array>
<array name="Four">
    <item>Category2_2_1</item>
    <item>Category2_2_2</item>
    <item>Category2_2_3</item>
    <item>Category2_2_4</item>
</array>
<array name="Five">
    <item>Category2_3_1</item>
    <item>Category2_3_2</item>
    <item>Category2_3_3</item>
    <item>Category2_3_4</item>
    <item>Category2_3_5</item>
</array>

<array name="Category3">
    <item>Category3_1</item>
    <item>Six</item>
    <item>Seven</item>
</array>
<array name="Category3_1">
    <item>Category3_1_1</item>
    <item>Category3_1_2</item>
    <item>Category3_1_3</item>
</array>
<array name="Six">
    <item>Category3_2_1</item>
    <item>Category3_2_2</item>
    <item>Category3_2_3</item>
    <item>Category3_2_4</item>
    <item>Category3_2_5</item>
    <item>Category3_2_6</item>
</array>
<array name="Seven">
    <item>Category3_3_1</item>
    <item>Category3_3_2</item>
    <item>Category3_3_3</item>
    <item>Category3_3_4</item>
    <item>Category3_3_5</item>
    <item>Category3_3_6</item>
    <item>Category3_3_7</item>
</array>