Android微调器检索到的值显示为吐司但不能进一步使用?

时间:2012-09-20 23:10:55

标签: android xml spinner

首先要说我到处寻找,我找不到解决办法,但如果我重复一些事情,我很抱歉。 所以这是一种情况,我有一个Android应用程序,它从一些xml url解析数据并在listview中显示它。还有一个微调器填充了一些项目,所以我想从xml中过滤掉已经从spinner中选择的变量的重新获取的数据,然后添加到listview。我创建了setOnItemSelectedListener,当我从spinner中选择一些东西时,我得到了该值的toast消息,但我以后不能使用它。这是代码:

public class profesorActivity extends ListActivity {
    // All static variables
    static final String URL = "http://cvele.net78.net/obavestenja1.xml";
    // XML node keys
    static final String KEY_OBAV = "obavestenja"; // parent node
    static final String KEY_PROF = "profesor";
    static final String KEY_PRE = "predmet";
    static final String KEY_TXT = "tekst";
    static final String KEY_VRE = "vreme";
    Spinner spin;
    ArrayAdapter<String> aa;
    String[] items = { "item1","item2", "item3", "item4", "item5", "item6","item7"};

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    XMLParser parser = new XMLParser();
    String xml = parser.getXmlFromUrl(URL); // getting XML
    Document doc = parser.getDomElement(xml); // getting DOM element
    Object string1;

    NodeList nl = doc.getElementsByTagName(KEY_OBAV);

    public void onCreate(Bundle savedInstanceState) {
        getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.profesor);

        spin=(Spinner)findViewById(R.id.spinner);
        aa = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,items);
        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spin.setAdapter(aa);
        spin.setOnItemSelectedListener(new OnItemSelectedListener(){
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id){
                string1=spin.getSelectedItem().toString();
                Toast.makeText(getBaseContext(), "Selected:" + string1.toString(),Toast.LENGTH_LONG ).show();
            }
            public void onNothingSelected(AdapterView<?> parent) {
                Toast.makeText(getBaseContext(), "Spinner1: unselected",Toast.LENGTH_LONG ).show();
            }
        });

        NodeList nl = doc.getElementsByTagName(KEY_OBAV);
        // looping through all item nodes <item>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            Element e = (Element) nl.item(i);

            // adding each child node to HashMap key => value
            map.put(KEY_PROF, parser.getValue(e,KEY_PROF));
            map.put(KEY_PRE, parser.getValue(e, KEY_PRE));
            map.put(KEY_TXT, parser.getValue(e, KEY_TXT));
            map.put(KEY_VRE, parser.getValue(e, KEY_VRE));

            if((parser.getValue(e, KEY_PROF)).equals(string1.toString()))
                menuItems.add(map);
            else
                Toast.makeText(getBaseContext(), "nothing", Toast.LENGTH_LONG).show();

        }
        // Adding menuItems to ListView
        ListAdapter adapter = new SimpleAdapter(this, menuItems,R.layout.list_item, new String[] { KEY_PROF, KEY_PRE, KEY_TXT, KEY_VRE }, new int[] {R.id.profesor,R.id.predmet, R.id.tekst, R.id.vreme});
        setListAdapter(adapter);

更确切地说,当我从微调器中选择一些东西时我希望它在变量string1中, 比起我所悲伤的,作为一个敬酒(Toast.makeText(getBaseContext(), "Selected:" + string1.toString(),Toast.LENGTH_LONG ).show();),每次我从旋转器中选择一些东西时都显示出来,但是因为循环string1没用,我不能用它来比较那个变量{ {1}},但是当我比较一个单词if((parser.getValue(e, KEY_PROF)).equals(string1.toString()))时,它可以工作,并且它也适用于旋转器中的第一个默认值。因此,更改所选值并不会在侦听器之外更改变量string1的状态。我尝试了很多其他方法来保存微调器选中的项目作为字符串,但没有运气。我做错了什么,我希望我描述好问题,如果我不是请问,我突然想到并在网上搜索。谢谢你。

1 个答案:

答案 0 :(得分:0)

当onCreate()方法运行时,它会执行所有代码。这意味着尚未设置类成员“Object string1”,因为spinner事件还没有被触发。您可能希望查看Android Activity生命周期,以便在适当的时候初始化和调用方法。

关键是一旦处理了微调器事件“onItemSelected”,你不仅要更新

string1=spin.getSelectedItem().toString();

但也要更新列表并为更改调用notify。