Выбор счетчика шаг за шагом зависит от выбранного значения - PullRequest
0 голосов
/ 02 июля 2018

У меня есть 3 счетчика и я так зависим друг от друга;

  • Категория1
  • Категория2
  • Category3

Когда пользователь выбирает Category1, 2.spinner должен показывать это;

  • Category1-1
  • Category1-2
  • Category1-3

И пользователь выбирает Category1-2, 3.spinner должен показать, что;

  • Category1-1-1
  • Category1-1-2
  • Category1-1-3

Я реализую этот способ, но он слишком длинный

поэтому я хочу любое предложение для более эффективного кода

public class BookActivity extends AppCompatActivity  implements AdapterView.OnItemSelectedListener {
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);
    List<String> list = new ArrayList<String>();
    list.add("Category1");
    list.add("Category2");
    list.add("Category3");

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    sp1.setAdapter(adapter);
    sp1.setOnItemSelectedListener(this);

}

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
                           long id) {
    // TODO Auto-generated method stub

    Toast.makeText(this, "YOUR SELECTION IS : " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();

    fillSpinnerList(parent.getItemAtPosition(position).toString());

}

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

}

public void fillSpinnerList(String selectedSpinnerName){

    if(selectedSpinnerName =="Category1" ){
        List<String> list = new ArrayList<String>();
        list.add("Category1-1");
        list.add("Category1-2");
        list.add("Category1-3");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp2.setAdapter(adapter);
        sp2.setOnItemSelectedListener(this);
    }
    if(selectedSpinnerName =="Category2" ){

        List<String> list = new ArrayList<String>();
        list.add("Category2-1");
        list.add("Category2-2");
        list.add("Category2-3");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp2.setAdapter(adapter);
        sp2.setOnItemSelectedListener(this);


    }
    if(selectedSpinnerName =="Category3" ){
        List<String> list = new ArrayList<String>();
        list.add("Category3-1");
        list.add("Category3-2");
        list.add("Category3-3");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp2.setAdapter(adapter);
        sp2.setOnItemSelectedListener(this);
    }
    if(selectedSpinnerName =="Category1-1" ){
        List<String> list = new ArrayList<String>();
        list.add("Category1-1-1");
        list.add("Category1-1-2");
        list.add("Category1-1-3");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp3.setAdapter(adapter);
        sp3.setOnItemSelectedListener(this);
    }
    if(selectedSpinnerName =="Category1-2" ){
        List<String> list = new ArrayList<String>();
        list.add("Category1-2-1");
        list.add("Category1-2-2");
        list.add("Category1-2-3");

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp3.setAdapter(adapter);
        sp3.setOnItemSelectedListener(this);
    }
    if(selectedSpinnerName =="Category1-3" ){
        List<String> list = new ArrayList<String>();
        list.add("Category1-3-1");
        list.add("Category1-3-2");
        list.add("Category1-3-3");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        sp3.setAdapter(adapter);
        sp3.setOnItemSelectedListener(this);
    }

}
}

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Попробуйте это:

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>

Надеюсь, это поможет !!

0 голосов
/ 02 июля 2018

Вы можете изменить его так. Это все еще долго, поскольку часть этого может быть обобщена, но это более читабельно.

BookActivity

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);
    }
} 

Реализация OnItemSelectedListener

public class SpinnerListener implements AdapterView.OnItemSelectedListener {

    private final Context mContext;
    private final Callback mCallback;

    public SpinnerListener(Context context, Callback callback) {
        mContext = context;
        mCallback = callback;
    }

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

        mCallback.onResult(itemName);
    }

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

    public interface Callback {
        void onResult(String itemName);
    }
}

Код можно немного сократить, если вы используете лямбда-функцию (Java 8). Например:

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

можно записать:

initSpinner(sp2, list, itemName -> initSpinner3(itemName));

или даже короче:

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

EDIT

Или вы можете сделать что-то подобное, используя массивы String вместо списков. Вы можете экспортировать методы для инициализации массива в отдельный файл, чтобы облегчить код в Activity:

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];
        }
    }
}
...