Autore Topic: Dettaglio di un elemento in una listview, problemi relativi al parsing del file  (Letto 295 volte)

Offline LonelyWolf

  • Utente junior
  • **
  • Post: 148
  • Respect: +12
    • Mostra profilo
    • Traversate dei laghi
  • Dispositivo Android:
    GT-I9505, ALE-L21
  • Sistema operativo:
    Windows 7 32/64
Salve a tutti, mi si presenta uno strano problema caricando il dettaglio di un elemento in una listview; partiamo dall'inizio.
Inizialmente si scarica un file xml (file statico che creo io con elementi definiti), se è già presente nel dispositivo si utilizza quello già scaricato, si fa il parsing degli elementi e si mettono i dati essenziali in una listview; l'id di ogni elemento corrisponde anche alla posizione nella listview (alla posizione 0 c'è una intestazione)
Poi assegno un listener per il click degli elementi della listview, in pratica se la posizione è > 0 (che è l'intestazione) viene chiamata la funzione per il dettaglio passando la posizione dell'elemento; fino a qua nessun problema.

La funzione che mostra il dettaglio riceve l'id/posizione, fa nuovamente il parsing del file e mostra tutti i dati; il problema è che usando il file xml e relativo parser fino al 4 elemento mostra i dati corretti, dal 5 al 7 mostra i dati della posizione+1, poi quelli della posizione+2 ecc.
Facendo il debug aon android studio (step by step) ho potuto controllare che i dati di riferimento sono corretti (posizione/id); ho pensato fosse un problema di codifica del file o cose simili ed ho rigenerato tutto il file sorgente, ma stesso risultato.

Allora ho pensato che fosse colpa della mia classe per il parsing del file xml, quindi ho riscritto la classe per utilizzare un semplice file csv (niente librerie dedicate è tutto semplice ed il file è breve), ogni riga corrisponde ad un elemento che prima era nel file xml.

A questo punto tutto sembra funzionare correttamente (a parte una cosa che non capisco a fine post!) tranne che per il primo elemento, o meglio l'elemento alla posizione 1 della listview; se seleziono un qualsiasi elemento dalla posizione 2 in poi tutto funziona correttamente; se seleziono l'elemento alla posizione 1 l'app va in crash, questo succede perchè non ho gestito il caso di elemento non trovato, cosa che non può accadere (la ricerca avviene solo per item in listview che sono caricati dal file, quindi esatta corrispondenza e prima di effettuare la ricerca controllo che il file sorgente sia ancora presente).

Eccovi un po' di codice:
Il listener:
Codice: [Seleziona]
ListView elenco = (ListView) screen.findViewById(android.R.id.list);
        elenco.setTextFilterEnabled(true);
        if (elenco.getCount()>1) {
            //più di 1 elemento, l'intestazione è alla posizione 0
            elenco.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                        if (position>0) { //se c'è almeno un elemento, itemID=0 nessun elemento
                            dettaglio(String.valueOf(position));
                        }
                        else { //errore nell'inserimento
                            Simply_Toast toast = new Simply_Toast(contesto,(contesto.getString(R.string.titolo_err)+"\n"+contesto.getString(R.string.no_events)));
                        }
                }
            });
La funzione che avvia il dettaglio:
Codice: [Seleziona]
private void dettaglio(String itemID) {//id evento
        //avviare attività dettaglio
        ((MainActivity)getActivity()).startdetail(5,itemID);
    }
La funzione startdetail nel main, accorcio all'indispensabile:
Codice: [Seleziona]
i = new Intent(this, CalendarDetail.class);
i.putExtra("ID_EVENTO",itemID);
startActivityForResult(i, tipo);
Questa è la funzione di ricerca della classe per fare il parsing del file
Codice: [Seleziona]
public Evento_class findCsv(String csvUrl, String needed){
        String id = "";
        String readString = "";
        Evento_class newEvent = null;
        try {
            File filecsv = new File(csvUrl);
            BufferedReader buffreader = new BufferedReader (new FileReader(filecsv)) ;
            while (readString != null) {
                readString = buffreader.readLine();
                String[] evento = readString.split(";");
                id = evento[0]+"";
                if (id.equals(needed)) {
                    readString = null; //per terminare il ciclo
                    String data = evento[1];
                    String titolo = evento[2];
                    String luogo = evento[3];
                    String distanze = evento[4];
                    String tipo = evento[5];
                    newEvent = new Evento_class();
                    newEvent.setEvento(id, titolo, data, luogo, distanze, tipo.charAt(0));
                }
            }
        } catch (Exception e) {
            Simply_Toast toast = new Simply_Toast(contesto,(contesto.getString(R.string.errore_xmlfile)+"\n"+e.toString()));
        }
        return newEvent;
    }

La funzione nella classe CalendarDetail.class non la posto, semplicemente istanzia il parser, richiama la funzione findCsv e imposta le textview con i dati ottenuti (e crash se ritorna null! :D )

Potrei mettere un controllo iniziale su lla variabile needed, in caso di primo elemento non effettuare il ciclo e leggere direttamente la prima riga del file, ma secondo me non è la soluzione migliore.

Ed ora ecco la cosa che non capisco (qua semplifico):
Codice: [Seleziona]
String needed = "2"; //passato come parametro nella chiamata della funzione
String line = "2;titoloevento;dataevento;tipoevento;altridati"; //corrisponde alla riga letta dal file csv
String[] evento = line.split(";");
evento[0].equals(needed) //restituisce false
String tmpid = evento[0]+"";
tmpid.equals(needed) //restituisce true
La stessa cosa utilizzando == invece di .equals(); == funziona perfettamente sul singolo carattere.

Grazie
« Ultima modifica: 05 Giugno 2015, 10:31:10 CEST da LonelyWolf »
Se la mia risposta ti è utile, per favore un thanks!