Я не могу получить правильную позицию выбранного предмета Spinner - PullRequest
0 голосов
/ 03 июля 2018
TextView tvRes;
Button btn;
String fgpa;
int maxGrade[]=new int[] {4,3,3,3,3,3,2,2,2};
double rcvdGrade[]=new double[9];
double[] fres=new double[9];
int ssp1;
double sumRes=0,sumPoints=0;
double fail=0;
Spinner sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9;
ArrayAdapter<CharSequence> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sp1 = findViewById(R.id.sp1);
    sp2 = findViewById(R.id.sp2);
    sp3 = findViewById(R.id.sp3);
    sp4 = findViewById(R.id.sp4);
    sp5 = findViewById(R.id.sp5);
    sp6 = findViewById(R.id.sp6);
    sp7 = findViewById(R.id.sp7);
    sp8 = findViewById(R.id.sp8);
    sp9 = findViewById(R.id.sp9);
    btn=findViewById(R.id.btn);
    tvRes=findViewById(R.id.tvRes);
    adapter=ArrayAdapter.createFromResource(this,R.array.grades,android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    sp1.setAdapter(adapter);
    sp2.setAdapter(adapter);
    sp3.setAdapter(adapter);
    sp4.setAdapter(adapter);
    sp5.setAdapter(adapter);
    sp6.setAdapter(adapter);
    sp7.setAdapter(adapter);
    sp8.setAdapter(adapter);
    sp9.setAdapter(adapter);
    ssp1=sp1.getSelectedItemPosition();

        if(ssp1==0){
            rcvdGrade[0]=10;
        }
        if (ssp1=='1'){
            rcvdGrade[0]=9;
        }
         if(ssp1=='2'){
            rcvdGrade[0]=8;
        }
        if(ssp1=='3'){
            rcvdGrade[0]=7;
        }
        if(ssp1=='4'){
            rcvdGrade[0]=6;
        }
         if(ssp1=='5'){
        rcvdGrade[0]=5;
        }
        if(ssp1=='6'){
            fail=0;
        }

Я новичок в программировании. Я пытаюсь получить позицию Spinner и, используя это значение, я назначу значение переменной, из которой я могу вычислить процент. Но этот код всегда выбирает первое условие и устанавливает значение 10 . Я не могу понять, что не так с этим кодом. Помоги мне, ребята. Кроме того, если у вас есть предложения или улучшения с этим кодом, пожалуйста, сообщите мне, друзья. Заранее спасибо.

Дополнительно: Я также пытался использовать функцию getSelectedItemPosition(); непосредственно в операторе if, а также пытался получить значения путем сравнения текста в Spinner, но это дает мне то же самое ( всегда выбирает первое условие) результат.

1 Ответ

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

Ваш код работает, как только действие создано. Это означает, что он получает положение счетчика, как только он сделан, который всегда будет нулевым. Этот код больше не будет запускаться, чтобы дать вам другое значение. Вам необходимо настроить OnItemSelectedListener, чтобы значение менялось при каждом изменении положения счетчика.

private AdapterView.OnItemSelectedListener spinnerListener =
            new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            // Called anytime a spinner dropdown item is clicked
        }

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

        }
    };

Тогда в вашем onCreate() методе напишите это:

sp1.setOnItemSelectedListener(spinnerListener);

Это относится только к sp1, но если вы установили все счетчики с этим же слушателем, знайте, что параметр parent в слушателе - это изменившийся счетчик. Если вам необходимо узнать, какой спиннер был заменен, используйте методы setTag() и getTag().

В onCreate():

sp1.setTag("sp1");
sp2.setTag("sp2");
// set Listeners, etc

В вашем onItemSelected()

if (parent.getTag().equals("sp1")) //It was sp1 that changed
       // do stuff
    else if (parent.getTag().equals("sp2")) //sp2 changed
       // do other stuff

РЕДАКТИРОВАТЬ: В соответствии с вашим запросом, здесь комбинация выше:

// Previous declarations
int ssp1;
double sumRes=0,sumPoints=0;
double fail=0;
Spinner sp1,sp2,sp3,sp4,sp5,sp6,sp7,sp8,sp9;
ArrayAdapter<CharSequence> adapter;
private AdapterView.OnItemSelectedListener spinnerListener =
            new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            int position = parent.getSelectedItemPosition(); // also equal to the parameter position
            if (parent.getTag().equals("sp1")) // sp1 was changed this time
                // Change rcvdGrade[0] as you please
            else if (parent.getTag().equals("sp2")) // sp2 changed
                // Change rcvdGrade[1] as you please
            else if (parent.getTag().equals("sp3")) //etc
                //etc
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            // This is required to make the listener happy, but leave it blank
        }
    };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sp1 = findViewById(R.id.sp1);
    sp2 = findViewById(R.id.sp2);
    sp3 = findViewById(R.id.sp3);
    // others set, adapters set, etc
    sp1.setTag("sp1");
    sp2.setTag("sp2");
    sp3.setTag("sp3");
    // etc
    sp1.setOnItemSelectedListener(spinnerListener);
    sp2.setOnItemSelectedListener(spinnerListener);
    sp3.setOnItemSelectedListener(spinnerListener);
    // etc
}

Я здесь не для того, чтобы писать весь ваш код, но я надеюсь, что это поможет вам лучше понять это. Если нет, пожалуйста, посмотрите учебники для OnItemSelectedListener, потому что это то, что вы хотите лучше всего работать с блеснами. Если вы уверены, что хотите использовать OnClickListener, установите вместо этого кнопку.

...