【问题标题】:Spinner does not update微调器不更新
【发布时间】:2017-11-07 23:36:35
【问题描述】:

我有 3 个微调器,当第一个微调器更新时,应该更新第二个和第三个微调器,但只有第二个微调器正在更新。这两个检查确实被打印到 logcat,但第三个微调器没有被更新。如果我注释掉 spinner2.setAdapter() 那么第三个微调器将更新。如果我更改顺序以便首先更新第 3 个微调器,那么第 2 个微调器仍会更新,而第 3 个则不会。我哪里错了?

我正在使用下面的代码:

spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
    {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
        {
            pos = arg2;

            switch(pos)
            {
            case 0:
                allDepts.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                spinner2.setAdapter(allDepts);
                allCourses.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                spinner3.setAdapter(allCourses);                    
                break;
            case 1:
                AEDepartments.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                AEDepartments.notifyDataSetChanged();
                spinner2.setAdapter(AEDepartments);
                Log.v("Spinner check", "Department check."); 

                AECourses.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                AECourses.notifyDataSetChanged(); 
                spinner3.setAdapter(AECourses);
                Log.v("Spinner check", "Course check.");
                break;
            }
        }

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

编辑: 因此,当应用程序加载时,它将显示“请选择学校”,并将显示所有部门和课程。当我单击第一个微调器并将其更改为“学校 1”时。应更新 spinner2 以仅显示学校 1 中的部门(AEDepartments 阵列适配器中的内容),并且应更新 spinner3 以便仅显示学校 1 中的课程(AECourses 阵列适配器中的内容)。

@Override
public void onCreate(Bundle savedInstanceState) 
{       
    super.onCreate(savedInstanceState);
    setContentView(R.layout.student1);

    spinner1 = (Spinner)this.findViewById(R.id.school);
    spinner2 = (Spinner)this.findViewById(R.id.dept);
    spinner3 = (Spinner)this.findViewById(R.id.course);

    ArrayAdapter<School> allSchools = new ArrayAdapter<School>(this,
            android.R.layout.simple_spinner_item, new School[] {    
            new School("","-- Please Select School --"),
            new School("A","School 1"),
            new School("B","School 2"),
            new School("C","School 3")
    });

    allSchools.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);

    spinner1.setAdapter(allSchools);
    spinner1.setOnItemSelectedListener(this);       

    final ArrayAdapter<School> allDepts = new ArrayAdapter<School>(this,
            android.R.layout.simple_spinner_item, new School[] {    
            new School("","-- Please Select Department --"),
            new School("1","Dep1"),
            new School("2","Dep2"),
            new School("3","Dep3"),
            new School("4","Dep4")
    });

    allDepts.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
    spinner2.setAdapter(allDepts);
    spinner2.setOnItemSelectedListener(this);         

    final ArrayAdapter<School> allCourses = new ArrayAdapter<School>(this,
            android.R.layout.simple_spinner_item, new School[] {
            new School("","-- Please Select Course --"),
            new School("C1","Couyrse1"),
            new School("C2","Couyrse2"),
            new School("C3","Couyrse3"),
            new School("C4","Couyrse4")
    });
    allCourses.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);       
    spinner3.setAdapter(allCourses);
    spinner3.setOnItemSelectedListener(this); 



    //Displaying all the departments in School 1
    final ArrayAdapter<School> AEDepartments = new ArrayAdapter<School>(this,
            android.R.layout.simple_spinner_item, new School[] {    
            new School("","-- Please Select Department --"),
            new School("1","Dep1"),
            new School("3","Dep3")
    }); 

    //Displaying all the courses in School 1
    final ArrayAdapter<School> AECourses = new ArrayAdapter<School>(this,
            android.R.layout.simple_spinner_item, new School[] {    
            new School("","-- Please Select Course --"),
            new School("C1","Couyrse1"),
            new School("C3","Couyrse3")
    }); 


    spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
    {
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
        {
            pos = arg2;

            switch(pos)
            {
            case 0:
                allDepts.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                allCourses.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                spinner2.setAdapter(allDepts);
                spinner3.setAdapter(allCourses);                
                Log.v("Spinner check", "Department check.");
                Log.v("Spinner check", "Course check.");
                break;

            case 1:
                AEDepartments.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                AEDepartments.notifyDataSetChanged();
                spinner2.setAdapter(AEDepartments);
                Log.v("Spinner check", "Department check."); 

                AECourses.setDropDownViewResource(R.layout.multiline_spinner_dropdown_item);
                AECourses.notifyDataSetChanged(); 
                spinner3.setAdapter(AECourses);
                Log.v("Spinner check", "Course check.");
                break;
            }
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) 
        {
        }
    });
}

【问题讨论】:

  • 我不明白。在case 0: 中,您使用的是allDeptsallCourses,但在case 1: 中,您使用的是AEDepartmentsAECourses。没有看到更多代码,很难提出任何建议。
  • 我有几个不同的阵列适配器。最初它会显示 allDepts 和 allCourses,但是当 spinner1 更改为第一个选项时,我希望显示两个不同的数组适配器。
  • 我添加了更多应该有帮助的代码。

标签: android android-spinner


【解决方案1】:

我解决了我的问题!那是当我设置 spinner2 和 spinner3 来更改值时, spinner2.setOnItemSelectedListener() 也更改了 spinner3 值(只有当我自己在 spinner2 上选择一个值时才会更改)。所以 spinner2 写完了我在 spinner1 中设置的内容。我添加了一个 if 语句并修复了它。

【讨论】:

    【解决方案2】:

    我通过关注edittext解决了这个问题。 edittext.requestfocus(),这会使片段聚焦到 UI 并更新值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      相关资源
      最近更新 更多