2013-09-20 3 views
1

У меня есть xml-файл, где я показываю текст из первого тега, имя сокровища, в прядильщике для выбора пользователем. После выбора мне нужно иметь доступ к другим данным, связанным с выбранным именем сокровищ, которое хранится в документе xml (в файле данных, хранящемся на устройстве). Я проанализировал файл xml и сохранил каждый элемент в отдельном списке массивов. Когда пользователь нажимает кнопку (Get Clue), я должен иметь возможность отображать первый ключ, связанный с этим сокровищем. Этот проект должен состояться сегодня к полуночи, и это последняя часть, которую я просто не могу получить. Любая помощь будет принята с благодарностью. Я добавил код, чтобы сделать это:Показать другие данные на основе выбора счетчика

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

Я столкнулся с той же ошибки (java.lang.ArrayIndexOutOfBoundsException: длина = 12; индекс = -1) с прядильщиков слишком , В моем случае я пытался установить Adapter на spinner вне потока ui. После переноса связанного кода внутри runOnUiThread проблема решена.

Смежные вопросы