我无法获得微调框的正确选定项目位置

时间:2018-07-03 15:06:38

标签: android spinner android-spinner

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 :(得分:2)

创建活动后,您的代码将立即运行。这意味着一旦制成,它将获得微调器的位置,该位置始终为零。该代码将不会再次运行以给您带来不同的价值。您需要设置一个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,请将其设置为按钮。