根据微调器选择显示其他数据

时间:2013-09-20 12:51:37

标签: java android spinner

我有一个xml文件,我在第一个标签,宝藏名称中显示文本,在微调器中供用户选择。选择后,我需要能够访问与存储在xml文档中的所选宝藏名称相关联的其他数据(存储在设备上的数据文件中)。我已经解析了xml文件并将每个项目存储在一个单独的数组列表中。当用户点击按钮(获取线索)时,我需要能够显示与该宝藏相关的第一条线索。这个项目今天午夜到期,这是我似乎无法得到的最后一块。任何帮助将不胜感激。我添加了代码来尝试这样做:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
//import java.lang.reflect.Array;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.os.Bundle;
import android.app.Activity;
//import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class PlayGeoTreasureActivity extends Activity implements OnItemSelectedListener {

    ArrayList<String> treasureList=new ArrayList<String>();
    ArrayList<String>clue1List=new ArrayList<String>();
    ArrayList<String> clue2List=new ArrayList<String>();
    ArrayList<String> clue3List=new ArrayList<String>();
    ArrayList<String> answerList=new ArrayList<String>();
    ArrayList<String> locationList=new ArrayList<String>();
    ArrayList<String> pointValueList=new ArrayList<String>();


    XmlPullParserFactory parser;
    XmlPullParser xpp;
    TextView selected;

    Spinner spinnerTreasures;
    //Spinner spinnerTreasures = new Spinner(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play_geo_treasure);

        spinnerTreasures = (Spinner)findViewById(R.id.treasuresSpinner);


        //get the xml file
        File filename = new File(getFilesDir(), "treasure.xml");

        //check to see if file exists.  If it does, read it.

    try {
        if(filename.exists())
        {       
            readXML(filename);
        }
        else
        {
            Toast.makeText(null, "File not Found", Toast.LENGTH_LONG).show();
        }  
        }catch (FileNotFoundException e) {
            //String errorMessage=(e.getMessage()==null)?"Message is Empty":e.getMessage();
            //Log.e("GeoTreasureGameLog",errorMessage);
            Log.e("GeoTreasureGameLog", (e.toString()));
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            //String errMessage=(e.getMessage()==null)?"Message is Empty":e.getMessage();
            //Log.e("GeoTreasureGameLog",errMessage);
            Log.e("GeoTreasureGameLog", (e.toString()));
            e.printStackTrace();
        }

    }


    private void readXML(File filename) throws XmlPullParserException, FileNotFoundException {
        // pull parser to read xml file
                    parser = XmlPullParserFactory.newInstance();
                    xpp = parser.newPullParser();

                    // point the xml parser to file
                    xpp.setInput(new FileReader(filename)); 

                    // get start and end tags
                    int eventType = xpp.getEventType();

                    // set current tag
                    String currentTag="";

                    // current value of the tag's element

                    String currentElement="";

                    //int counter = 0;
                    try{
                    // parse the entire xml file until done
                    while (eventType != XmlPullParser.END_DOCUMENT)
                    { 
                        // look for start tags
                        if(eventType == XmlPullParser.START_TAG)
                        {
                            // get the name of the start tag
                            currentTag = xpp.getName();

                            if (currentTag.equals("TreasureName"))
                            {
                                currentElement = xpp.nextText();
                                treasureList.add(currentElement);
                            }
                                else if (currentTag.equals("ClueOne"))
                                {
                                    currentElement = xpp.nextText();
                                    clue1List.add(currentElement);
                                }
                                else if (currentTag.equals("ClueTwo"))
                                {
                                    currentElement = xpp.nextText();
                                    clue2List.add(currentElement);
                                }
                                else if (currentTag.equals("ClueThree"))
                                {
                                    currentElement = xpp.nextText();
                                    clue3List.add(currentElement);
                                }
                                else if (currentTag.equals("Answer"))
                                {
                                    currentElement = xpp.nextText();
                                    answerList.add(currentElement);
                                }
                                else if (currentTag.equals("TreasureLocation"))
                                {
                                    currentElement = xpp.nextText();
                                    locationList.add(currentElement);
                                }
                                else if (currentTag.equals("PointValue"))
                                {
                                    currentElement = xpp.nextText();
                                    pointValueList.add(currentElement);
                                }
                        }
                        eventType = xpp.next();
                        }
                    } catch (Exception e)

                    {
                        //Log.e("GeoTreasureGameLog", e.getMessage());
                        Log.e("GeoTreasureGameLog", (e.toString())); 

                    }

                    ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_dropdown_item,treasureList);

                    selected=(TextView) findViewById(R.id.itemSelected);
                    spinnerTreasures.setOnItemSelectedListener(PlayGeoTreasureActivity.this);
                    spinnerTreasures.setAdapter(spinnerArrayAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.play_geo_treasure, menu);
        return true;
    }




@Override
    public void onItemSelected(AdapterView<?> parent,
            View v, int position, long id) {
        selected.setText(treasureList.get(position));
        int i=treasureList.indexOf(selected);
        clueOne=clue1List.get(i).toString();
        clueTwo=clue2List.get(i).toString();
        clueThree=clue3List.get(i).toString();
        Button getClue = (Button)findViewById(R.id.getClueBtn);
        getClue.setOnClickListener((OnClickListener) this);

        }
        public void OnClick(View v) throws IOException{
            int buttonClicks = 3;
            TextView clue1=(TextView)findViewById(R.id.clue1TxtView);
            TextView clue2 = (TextView)findViewById(R.id.clue2TextView);
            TextView clue3=(TextView)findViewById(R.id.clue3TextView);
            if (buttonClicks == 3){
                clue1.setText(clueOne);
                buttonClicks=2;
            }
            else if (buttonClicks==2){
                clue2.setText(clueTwo);
                buttonClicks=1;
            }
            else if (buttonClicks==1){
                clue3.setText(clueThree);
                buttonClicks=0;
            }
            else if (buttonClicks==0)
                Toast.makeText(getBaseContext(), "No more clues are available", Toast.LENGTH_LONG).show();

    }


    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        selected.setText("Please choose a treasure");

    }


}

感谢我能得到的任何意见!!!

好的,我尝试过这样做,并收到错误:

09-15 16:33:47.439: E/AndroidRuntime(1440): FATAL EXCEPTION: main
09-15 16:33:47.439: E/AndroidRuntime(1440): java.lang.ArrayIndexOutOfBoundsException: length=12; index=-1
09-15 16:33:47.439: E/AndroidRuntime(1440):     at java.util.ArrayList.get(ArrayList.java:310)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at com.rasmussen.geotreasuresgame.PlayGeoTreasureActivity.onItemSelected(PlayGeoTreasureActivity.java:182)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:892)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.widget.AdapterView.access$200(AdapterView.java:49)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.os.Handler.handleCallback(Handler.java:730)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.os.Looper.loop(Looper.java:137)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at android.app.ActivityThread.main(ActivityThread.java:5103)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at java.lang.reflect.Method.invokeNative(Native Method)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at java.lang.reflect.Method.invoke(Method.java:525)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-15 16:33:47.439: E/AndroidRuntime(1440):     at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:1)

我也遇到了与微调器相同的错误(java.lang.ArrayIndexOutOfBoundsException:length = 12; index = -1)。在我的例子中,我试图在ui线程之外的spinner上设置Addapter。将相关代码包装在runOnUiThread中后,问题就解决了。