【问题标题】:Dynamic Spinner not working correctly动态微调器无法正常工作
【发布时间】:2016-05-29 03:53:56
【问题描述】:

我有一个 spinner2,它有日期和月份,当用户选择日期时,s1 和 s2 将分别显示小时和分钟。

在活动开始时,我选择了每日。 问题是我每天都在敬酒。这表明它会无休止地被选中。此外,我无法在 s1 和 s2 中选择值,微调器彼此之间不断刷新。如何解决?

public class try_spinner extends Activity implements AdapterView.OnItemSelectedListener {
Spinner spinner1, spinner2, s1, s2, s3;
String app_name, room_name;
TextView app, room;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.try_spinner);

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);

int width = dm.widthPixels;
int height = dm.heightPixels;

getWindow().setLayout((int) (width * .9), (int) (height * .7));

Bundle extras = getIntent().getExtras();
final String app_string = extras.getString("APPLIANCE_NAME");
final String room_string = extras.getString("APPLIANCE_ROOM");

app = (TextView) findViewById(R.id.app_name);
app.setText(app_string);
room = (TextView) findViewById(R.id.room_name);
room.setText(room_string);

spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner1.setOnItemSelectedListener(this);

spinner2 = (Spinner) findViewById(R.id.spinner2);
s1 = (Spinner) findViewById(R.id.s1);
s2 = (Spinner) findViewById(R.id.s2);
s3 = (Spinner) findViewById(R.id.s3);
spinner2.setOnItemSelectedListener(this);
s1.setOnItemSelectedListener(this);
s2.setOnItemSelectedListener(this);
s3.setOnItemSelectedListener(this);

if (app_string.equals("Lighting")) {
    ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.lighting));
    dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter2.notifyDataSetChanged();
    spinner1.setAdapter(dataAdapter2);
} else if (app_string.equals("Shower Heater")) {
    ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.shower_heater));
    dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter2.notifyDataSetChanged();
    spinner1.setAdapter(dataAdapter2);
} else {
    ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.empty));
    dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter2.notifyDataSetChanged();
    spinner1.setAdapter(dataAdapter2);
}

}


@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                       long arg3) {
// TODO Auto-generated method stub
String txt_spinner2 = String.valueOf(spinner2.getSelectedItem());
Toast.makeText(this, txt_spinner2, Toast.LENGTH_SHORT).show();
if (txt_spinner2.contentEquals("Daily")) {
    List<String> list = new ArrayList<String>();
    ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.days));
    dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter.notifyDataSetChanged();
    s1.setAdapter(dataAdapter);
    String txt_s1 = String.valueOf(s1.getSelectedItem());

    //set for daily hours usage
    List<String> list3 = new ArrayList<String>();
    ArrayAdapter<String> dataAdapter3 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.hours));
    dataAdapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter3.notifyDataSetChanged();
    s2.setAdapter(dataAdapter3);

    //set for daily minutes usage
    List<String> list4 = new ArrayList<String>();
    ArrayAdapter<String> dataAdapter4 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.hours));
    dataAdapter4.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter4.notifyDataSetChanged();
    s2.setAdapter(dataAdapter4);

    //set for daily empty thrd space
    List<String> list5 = new ArrayList<String>();
    ArrayAdapter<String> dataAdapter5 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.empty));
    dataAdapter5.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter5.notifyDataSetChanged();
    s3.setAdapter(dataAdapter5);
}

else if (txt_spinner2.contentEquals("Monthly")) {
    List<String> list = new ArrayList<String>();
    list.add("Conveyance");//you should add items from db here(2nd spinner)
    list.add("the end");
    ArrayAdapter<String> dataAdapter6 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, list);
    dataAdapter6.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    dataAdapter6.notifyDataSetChanged();
    s3.setAdapter(dataAdapter6);
}

}

【问题讨论】:

  • 我从您的代码中得到的是,您正在向 spinner1 提供值,但是单击时,您正在从 spinner2 获取项目。这是为什么呢?
  • spinner1 和 spinner2 最初都设置了值,而 s1,s2,s3 最初为空。 spinner1 将根据 textview 标题中的文本进行设置,例如加热器或照明。 spinner2 是动态的,用户选择每天或每月,然后 s1,s2,s3 将设置为每天的 (hours, mins, null) 或每月的 (days,hours,mins) 的值.. 问题在于动态spinner2 导致 s1,s2,s3 无法选择。他们不断刷新微调器 s1,s2,s3,通过获得无数的 ("daily") 来证明,这正好在 (spinner2.getSelectedItem()); 之后

标签: android android-studio android-spinner


【解决方案1】:

首先将适配器设置为微调器,然后为其调用 setOnItemSelectedListener()。 b'z 当微调器值被初始化时,它甚至调用 setOnItemSelectedListener 方法。您可以放置​​调试器并检查。

其次,始终检查您收到事件的微调器或小部件,对于微调器,您可以这样做

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

    Spinner clickedSpinner = (Spinner) parent;

    switch (clickedSpinner.getId()) {
        case R.id.spinner1:
            // your code for spinner1
            String str = spinner1.getSelectedItem().toString();
            break;
    }
}

所以改变你的代码,看看它是否工作。希望对你有帮助...

【讨论】:

  • Spinner clickedSpinner = (Spinner) parent; 这行是否意味着将哪个微调器设置为父级来决定其下子级的值?
  • @whoami 不,正在将视图投射到微调器。 Adapterview 就像抽象父类,因此您可以转换为特定的子类。在这种情况下,铸造成微调器。
  • 我认为它现在有效。还有一个问题。如果我有一个按钮,当单击它时,它将获得微调器的值。如何访问 itemselected 类中的值?
  • @whoami 最好接受这个答案,对于你的第二个问题,你可以这样做,以防 String str = spinner1.getSelectedItem().toString();您可以获取变量本地或类变量,然后在用户单击按钮时访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2016-08-04
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2022-12-05
  • 2018-08-05
相关资源
最近更新 更多