0

Android デバイス用の XML ファイル エクスプローラーを実行しようとしています。ユーザーが選択したファイルに応じて、そのファイルが開かれ、読み取られます。ただし、XML を解析するときに問題が発生し、これらの値が表示されるクラスにこれらの値を送信します。解析された値のリストがいくつかありますが、値は最初の読み取りファイルに対してのみ保存されます。別のファイルを選択すると、ウィンドウには常に同じ値が表示されます(初めて読み取られたもの)。これらの値を2つのクラス間で転送するために静的を使用し、新しい値が保存されないため、問題があると思います。これが問題である場合、これら 2 つのクラスに値を渡すための解決策は何でしょうか? ありがとうございます これは、さまざまなファイルを解析してこれらの値をリストに保存するコードです。

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));

お時間をいただきありがとうございます

編集: 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();
            }
        }




    }

Parse() メソッドを呼び出したときの 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);





}
4

1 に答える 1

1

実際、問題はstaticフィールドの使用にあります。クラスがロードされArrayListsたときに、一度だけ初期化しています。その後、これらのリストXMLPullParserHandlerを呼び出すだけです。add()したがって、新しいファイルを解析するときは、以前のファイルの値に値を追加するだけです。アプリケーションを少し再設計することをお勧めします。

  • ファイルを解析し、カスタム アイテムXMLPullParserHandlerの を返すように作り直します。List情報を保存するのではなく、解析して返すだけです
  • XMLPullParserHandlerファイルを解析する必要があるたびにの新しいインスタンスを作成し、そのparse()メソッドを呼び出してアイテムのリストを返し、これらのアイテムを表示します

お役に立てれば。

于 2013-03-23T17:19:20.823 に答える