2013-03-23 4 views
0

Im пытается сделать проводник XML-файлов для устройств Android и в зависимости от того, какой файл пользователь выбирает, этот файл открывается и читается. Однако у меня возникает проблема при анализе XML-данных, и я отправляю эти значения классу, где показаны эти значения. У меня есть несколько списков для проанализированных значений, но значения хранятся только для первого файла чтения. Если я выбираю другие файлы, то в окне всегда отображаются те же самые значения (те, которые читаются впервые). Я думаю, что есть проблема, потому что я использую static для переноса этих значений между 2 классами, и новые значения никогда не сохраняются. Если это проблема, то может быть решением для передачи значений в эти 2 класса? Спасибо Вот код, где я разбираю разные файлы и сохраняю эти значения в списках.Android: Невозможно сохранить новые значения в Arraylists

public class XMLPullParserHandler { 
    static List<Puntuacion> puntuaciones; 
    private static Puntuacion puntuacion; 
    static List<String> nombres = new ArrayList<String>(); 
    static List<String> a = new ArrayList<String>(); 
    static List<String> e = new ArrayList<String>(); 
    static List<String> sr = new ArrayList<String>(); 
    static List<String> pc = new ArrayList<String>(); 
    static List<String> ps = new ArrayList<String>(); 
    static List<String> ir = new ArrayList<String>(); 
    static List<String> ip = new ArrayList<String>(); 
    static List<String> por = new ArrayList<String>(); 



    private static String text; 

    public XMLPullParserHandler() { 
     puntuaciones = new ArrayList<Puntuacion>(); 
    } 

    public static List<Puntuacion> getPuntuacion() { 
     return puntuaciones; 
    } 

    public List<Puntuacion> parse(InputStream is) { 

     XmlPullParserFactory factory = null; 
     XmlPullParser parser = null; 
     try { 
      factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      parser = factory.newPullParser(); 

      parser.setInput(is, null); 

      int eventType = parser.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tagname.equalsIgnoreCase("TEST")) { 
         // create a new instance of puntuacion 



         puntuacion = new Puntuacion(); 
        } 
        break; 

       case XmlPullParser.TEXT: 
        text = parser.getText(); 
        break; 

       case XmlPullParser.END_TAG: 
        if (tagname.equalsIgnoreCase("TEST")) { 

         puntuaciones.add(puntuacion); 
        } else if (tagname.equalsIgnoreCase("Nom_Test")) { 
         puntuacion.setValor((text)); 
         nombres.add(text); 
        } else if (tagname.equalsIgnoreCase("NUMERO_ACIERTOS")) { 
         puntuacion.setValor_Transformado((text)); 

         a.add(text); 
        } else if (tagname.equalsIgnoreCase("NUMERO_ERRORES")) { 
         puntuacion.setValor_PS((text)); 
         e.add(text); 


       } else if (tagname.equalsIgnoreCase("VALOR_PC")) { 
        puntuacion.setValor_PS((text)); 
        pc.add(text); 


       } else if (tagname.equalsIgnoreCase("VALOR_PS")) { 
        puntuacion.setValor_PS((text)); 
        ps.add(text); 


      } else if (tagname.equalsIgnoreCase("VALOR_IP")) { 
       puntuacion.setValor_PS((text)); 
       ip.add(text); 


     } else if (tagname.equalsIgnoreCase("VALOR_IR")) { 
      puntuacion.setValor_PS((text)); 
      ir.add(text); 

     } 
     else if (tagname.equalsIgnoreCase("VALOR_POR")) { 
      puntuacion.setValor_PS((text)); 
      por.add(text); 

     } 
        break; 

       default: 
        break; 
       } 
       eventType = parser.next(); 
      } 

     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return puntuaciones; 
    } 

    public static String getNombre(int posicion){ 
     String[] ListN = new String[nombres.size()]; 
     ListN = nombres.toArray(ListN); 
     return ListN[posicion]; 
    } 
    public static String getA(int posicion){ 
     String[] ListA = new String[a.size()]; 
     ListA = a.toArray(ListA); 
     return ListA[posicion]; 
    } 
    public static String getE(int posicion){ 
     String[] ListE = new String[e.size()]; 
     ListE = e.toArray(ListE); 
     return ListE[posicion]; 
    } 
    public static String getPC(int posicion){ 
     String[] ListPC = new String[pc.size()]; 
     ListPC = pc.toArray(ListPC); 
     return ListPC[posicion]; 
    } 
    public static String getPS(int posicion){ 
     String[] ListPS = new String[ps.size()]; 
     ListPS = ps.toArray(ListPS); 
     return ListPS[posicion]; 
    } 
    public static String getIP(int posicion){ 
     String[] ListIP = new String[ip.size()]; 
     ListIP = ip.toArray(ListIP); 
     return ListIP[posicion]; 
    } 
    public static String getIR(int posicion){ 
     String[] ListIP = new String[ir.size()]; 
     ListIP = ir.toArray(ListIP); 
     return ListIP[posicion]; 
    } 
    public static String getP(int posicion){ 
     String[] ListIP = new String[por.size()]; 
     ListIP = por.toArray(ListIP); 
     return ListIP[posicion]; 
    } 

} 

Как я извлечь ArrayLists в другой класс, как в следующих примерах:

PS1.setText(XMLPullParserHandler.getPS(0)); 
IR1.setText(XMLPullParserHandler.getIR(0)); 

Спасибо за ваше время

EDIT: Вот код, в котором новый экземпляр из XMLPullParserHandler генерируется в XMLPullParserActivity:

public class XMLPullParserActivity { 


     public static void Parse(Context context){ 




      List<Puntuacion> puntuacion = null; 
      try { 
       XMLPullParserHandler parser = new XMLPullParserHandler(); 
       puntuacion = parser.parse(context.getAssets().open(MainActivity.fileName())); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 




    } 

MainActivity, когда я взываю к Разобрать() метод:

file = new File(path.get(position)); 
       file.getName(); 
       XMLPullParserHandler parser = new XMLPullParserHandler(); 

       XMLPullParserActivity.Parse(this); 
        Intent i = new Intent(MainActivity.this, Correccion.class); 
        startActivity(i); 





} 
+0

Пожалуйста, попробуйте улучшить именование переменных. имена двух буквенных переменных считаются загадочными, и вы можете испортить 'ir' с' ip', не осознавая ... – WarrenFaith

ответ

1

Действительно проблема лежит в использовании static полей. Вы инициализируете свой ArrayLists только один раз, когда загружается класс XMLPullParserHandler. После этого вы просто вызываете add() в этих списках. Поэтому, когда вы разбираете новые файлы, вы просто добавляете значения к предыдущим файлам. Я предлагаю вам перестроить ваше приложение немного:

  • Rework ваш XMLPullParserHandler разобрать файл и вернуть вам List пользовательских элементов. Он не должен хранить любую информацию, просто разобрать и вернуть
  • Создать новый экземпляр XMLPullParserHandler каждый раз, когда вам нужен файл проанализирован, вызовите метод parse(), который возвращает вам список элементов, а затем отобразить эти пункты

Надеюсь, это поможет.

+0

Большое спасибо Егору, однако Im немного потерян. Я что-то редактировал, и я создаю новый экземпляр XML при открытии выбранного файла: XMLPullParserActivity.Parse (this); Намерение i = новое намерение (MainActivity.this, Correccion.class); startActivity (i); – Katherine99

+0

@ Katherine99, вам действительно не нужна XMLPullParserActivity, тем более, что это даже не Activity. Создайте экземпляр XMLPullParserHandler внутри MainActivity и вызовите его метод parse() прямо там. – Egor

+0

Извините Егора, но я не очень хорошо знаю, как это сделать. Вы хотите записать это в mainActivity: XMLPullParserHandler Parser = new XMLPullParserHandler(); Parser.parse(); ??? Еще раз спасибо – Katherine99

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