こんにちは、いくつかの XML ファイルを表示するために使用するファイル エクスプローラーを設計しました。選択したファイルに応じて、1 つまたは別の XML を開きます。今のところ問題はまったくなく、XMLPullParser の助けを借りて、属性からのテキストをいくつかの ArrayList に挿入します。問題は、戻って別の XML ファイルを選択すると、これらの値が次の XML と同じになり、次の XML で発生することです。問題は、新しいインスタンスが呼び出されると、arrayLists が空にならないことだと思います。
これがどのように機能するかは次のとおりです。 FileExporer でファイルを表示し、任意のユーザーをクリックします。
public class MainActivity extends ListActivity {
private List<String> item = null;
private List<String> path = null;
private String root;
private TextView myPath;
static File file;
static String texto;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myPath = (TextView)findViewById(R.id.path);
root = Environment.getExternalStorageDirectory().getPath();
getDir(root);
}
private void getDir(String dirPath)
{
myPath.setText("Location: " + dirPath);
item = new ArrayList<String>();
path = new ArrayList<String>();
File f = new File(dirPath);
File[] files = f.listFiles();
if(!dirPath.equals(root))
{
item.add(root);
path.add(root);
item.add("../");
path.add(f.getParent());
}
for(int i=0; i < files.length; i++)
{
File file = files[i];
if(!file.isHidden() && file.canRead() && (file.getName().endsWith("xml"))){
path.add(file.getPath());
if(file.isDirectory()){
item.add(file.getName() + "/");
}else{
item.add(file.getName());
}
}
}
ArrayAdapter<String> fileList =
new ArrayAdapter<String>(this, R.layout.row, item);
setListAdapter(fileList);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
file = new File(path.get(position));
if (file.isDirectory())
{
if(file.canRead()){
getDir(path.get(position));
}else{
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("[" + file.getName() + "] folder can't be read!")
.setPositiveButton("OK", null).show();
}
}else {
file = new File(path.get(position));
file.getName();
XMLPullParser.Parse(this);
texto = XMLPullParserHandler.getA(0);
}
Parseo();
Intent i = new Intent(MainActivity.this, Correccion.class);
startActivity(i);
MainActivity.this.finish();
}
public void Parseo(){
}
public static String fileName(){
return file.getName();
}
public static String getText(){
return texto;
}
}
XMLPullParser: 読み取る必要があるファイルを示し、XMLPullParserHandler の新しいインスタンスを呼び出します。
public class XMLPullParser{
static String Fichero;
public static void Parse(Context context){
try {
List<Puntuacion> puntuacion;
XMLPullParserHandler parser = new XMLPullParserHandler();
File dir = Environment.getExternalStorageDirectory();
File yourFile = new File(dir, MainActivity.fileName());
FileInputStream iStream = new FileInputStream(yourFile);
puntuacion = parser.parse(iStream);
} catch (IOException e) {
e.printStackTrace();
}
}
}
XMLPullParserHandler: ArrayLists にテキストを作成して追加するときに、ここに問題があると思います: たとえば、この場合、ArrayList a
public class XMLPullParserHandler {
List<Puntuacion> puntuaciones;
private Puntuacion puntuacion;
static List<String> nombres = new ArrayList<String>();
static List<String> a = new ArrayList<String>();
private String text;
public XMLPullParserHandler() {
// puntuaciones.clear();
// puntuaciones.removeAll(puntuaciones);
puntuaciones = new ArrayList<Puntuacion>();
;
}
public 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("NUMERO_ACIERTOS")) {
puntuacion.setValor_Transformado((text));
a.add(text);
Log.i("ii", 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];
}
}
For example if I have in this case a XML with **<NUMERO_ACIERTOS>1</NUMERO_ACIERTOS>** and after this I read another one with **<NUMERO_ACIERTOS>3</NUMERO_ACIERTOS>** in my UI I only see the value **1** because is the first that has been loaded into the arraylist.
お時間とご注意いただきありがとうございます。