Как получить отдельные выборы из нескольких счетчиков, используя один адаптер? - PullRequest
0 голосов
/ 20 апреля 2019

Я создаю небольшое приложение для преобразования единиц измерения, в котором используются два счетчика, чтобы можно было выбирать значения от значения и от значения к значению.Два счетчика используют один и тот же адаптер и один и тот же строковый массив в strings.xml.Как разрешить выбор счетчиков по отдельности при одновременном сохранении выбранных значений в две отдельные переменные?

Я пробовал использовать операторы if и if, но они являются условными и управляющими операторами, которые неКажется, не решить проблему.Блесны можно подбирать индивидуально, чего я и хочу.Однако я не мог понять, как передать переменные, содержащие значения, из метода.

Я также пытался вызвать метод getSelectedItem () для обеих переменных, однако не похоже, чтобы метод мог отличить счетчики таким образом.Кроме того, он работает почти так же, как я и предполагал, переменные содержат выбранное значение счетчика.
Мне также пришлось установить положение счетчика с помощью этого метода setSelection (), так как счетчики были нулевыми в начале и вызывали сбой приложения.

Адаптер с счетчиками: переменные spinnerFrom и spinnerTo являются глобальными.

spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);

        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.velocity_array, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

        spinnerFrom.setAdapter(adapter);
        spinnerTo.setAdapter(adapter);
        spinnerFrom.setOnItemSelectedListener(this);
        spinnerTo.setOnItemSelectedListener(this);

If-оператор (Первая попытка)

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
        if(parent.getId() == R.id.spinnerDropdown)
        {
            spinner1 = Integer.parseInt(parent.getItemAtPosition(position).toString());
        }
        else if(parent.getId() == R.id.spinnerDropdown2)
        {
            spinner2 = Integer.parseInt(parent.getItemAtPosition(position).toString());
        }
}

getSelectedItem () (Вторая попытка)

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{
        spinnerFrom.setSelection(position);
        spinnerTo.setSelection(position);

        String values = "Spinner 1: " + spinnerFrom.getSelectedItem().toString() +
                "\nSpinner 2: " + spinnerTo.getSelectedItem().toString();

        resultDisplay.setText(values);
}

Обновление: текущий код

 @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        if(parent.getId() == R.id.spinnerDropdown)
        {
            spinner1 =(xmlArray[position]);
        }
        else if(parent.getId() == R.id.spinnerDropdown2)
        {
            spinner2 =(xmlArray[position]);
        }

        convertUnits(spinner1, spinner2); <-- Line 82

 public void convertUnits(String spinner1, String spinner2)
    {
        if(spinner1.contains("Double") && spinner2.contains("Triple")) <-- Line 95
        {
           //conversion method
        }
        ...

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.contains(java.lang.CharSequence)' on a null object reference
        at com.example.courseproject.Velocity.convertUnits(Velocity.java:95)
        at com.example.courseproject.Velocity.onItemSelected(Velocity.java:82)

Редактировать: вращатели работают, но это была моя первоначальная проблема с использованием условного оператора if.Переменная spinner2 равна нулю, и мое приложение вылетает.Мне нужны обе переменные.Я пробовал и .equals, и .contains, но не разрешаю нулевую точку.

Edit2: я не могу скопировать / вставить то, что показывает мне отладчик, но в строке 95 spinner2 отображается как 'null'.Похоже также, что значение spinner2 никогда не меняется от начального нуля в любом месте кода, в то время как spinner1 делает это.

1 Ответ

0 голосов
/ 20 апреля 2019

Следуйте приведенному ниже коду для лучшего просмотра, чтобы решить вашу проблему:

    public class MainActivity extends AppCompatActivity implements 
                  AdapterView.OnItemSelectedListener {
              Spinner spinnerFrom,spinnerTo;
              String[] menuArray;


            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                TextView textView=findViewById(R.id.text);

                spinnerFrom = (Spinner) findViewById(R.id.spinnerDropdown);
                spinnerTo = (Spinner) findViewById(R.id.spinnerDropdown2);

                menuArray = getResources().getStringArray(R.array.velocity_array);


                ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                        R.array.velocity_array, android.R.layout.simple_spinner_item);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);

                spinnerFrom.setAdapter(adapter);
                spinnerTo.setAdapter(adapter);
                spinnerFrom.setOnItemSelectedListener(this);
                spinnerTo.setOnItemSelectedListener(this);
            }

            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
            {
                if(parent.getId() == R.id.spinnerDropdown)
                {
                  int  spinner1 = Integer.parseInt(menuArray[position]);
                }
                else if(parent.getId() == R.id.spinnerDropdown2)
                {
                  int  spinner2 = Integer.parseInt(menuArray[position]);
                }
            }

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

            }
        }

<string-array name="velocity_array">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
    </string-array>
...