Autore Topic: List View popolato da file di testo  (Letto 673 volte)

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
List View popolato da file di testo
« il: 15 Giugno 2013, 12:48:50 CEST »
0
Salve sono nuovo sia del forum che del mondo android(mi ci sono approcciato pochi giorni fa),
mi è stato chiesto di realizzare una semplice list view popolata con un elenco salvato su un file di testo. fino a quando devo farlo in java e in locale tutto ok, quando lancio l'applicazione non mi trova(giustamente) il file su c:\ e quindi mi restituisce un elenco vuoto.
cercando sia  in rete che qui sul forum non mi sembra di aver trovato un topic a riguardo.
ho provato a capire come funziona l'internal storage utilizzando FileOutputStream e openFileOutput, ma se non ho capito male così si crea un file sul device ma i dati non vengono presi da una fonte esterna(come nel mio caso di un file esterno), ma da una stringa!
qualche consiglio?

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #1 il: 15 Giugno 2013, 13:05:04 CEST »
0
il file è sempre lo stesso ?
(quindi puoi metterlo fra le resource)
o dev'esser salvato su sd?

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:List View popolato da file di testo
« Risposta #2 il: 15 Giugno 2013, 16:09:29 CEST »
0
intanto grazie per la risposta,
il file è sempre lo stesso, devo prendere i campi da li e farne un list view
« Ultima modifica: 15 Giugno 2013, 16:21:08 CEST da Namtar »

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #3 il: 15 Giugno 2013, 20:45:53 CEST »
0
allora il file puoi metterlo dentro la cartella raw e accedergli da lì.
poi lo inserisci in un vettore e quindi popoli la list view
se serve posto il codice

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:List View popolato da file di testo
« Risposta #4 il: 16 Giugno 2013, 09:54:32 CEST »
0
ho creato la cartella raw dentro res, adesso per richiamarla se non ho capito male devo usare R.raw.Lista (lista è il nome del mio file).
per leggere il file sto usando il fileReader ma non funziona.
a questo punto se hai voglia di scrivermi il codice mi faresti un favore

« Ultima modifica: 16 Giugno 2013, 10:48:04 CEST da Namtar »

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #5 il: 16 Giugno 2013, 12:36:00 CEST »
+1
eccoti tutta la classe di una mia app (puoi cercare "pronto pizza" sul arket, eveder la lista, per capire l'output
naturalmente ho seguito la guida del forum per crearla, solo che ho aggiunto la lettura dal file, e lo split (cioè ogni riga del file contiene diverse informazioni)
se il file è grosso, è molto più veloce se salti il controllo sulle righe, e usi il metodo che ti legge i file 1 riga alla volta (non ricordo come si chiama)


naturalmente devi creare 2 layout, 1 con solo la lista, e 1 con solo il singolo elemento
e poi devi creare la classe per l'oggetto che vuoi rappresentare.

Infine, ho visto che hai solo 3 msg, dovresti presentarti nell'apposita sezione


Se ti è utile il mio codice, clicca sul tasto grazie ^^
Codice (Java): [Seleziona]
package pronto.pizza;




import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;


import android.app.Activity;
import android.content.ContextWrapper;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;


public class Lista extends Activity implements OnItemClickListener{
   
        ListView list;
        ArrayList<PuntoVendita> personList=new ArrayList<PuntoVendita>(); //lista dei punti che la listview visualizzerà
    @SuppressWarnings("null")
        @Override
       
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lista);
       
        //creo il vettore di oggetti
       
        String file = null;
       
        int b = 0;
        InputStream f = null;
                f = this.getResources().openRawResource(R.raw.pizze);
        do{
            try {
                                b = f.read();
                        } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
            if(b != -1) {file = file +(char)b;  
           
            }
        }while(b != -1);
           
           
        try {
                        f.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
       
       
               
                //System.out.println("stampo file:" +file);
               
        String[] uno = null;
        uno=file.split(";");
        int lunghezza = uno.length;
        PuntoVendita[] punti = new PuntoVendita[lunghezza];
       
        for(int i=1; i<uno.length-1; i++){
                //System.out.println(uno[i]);
                String [] due =  null;
                due = uno[i].split(",");
                //System.out.println(due[0]);
                String nome, prezzo, ingredienti;
                nome=due[0];
                prezzo=due[1];
                ingredienti=due[2];
               
               
               
                PuntoVendita a = new PuntoVendita(nome, prezzo, ingredienti);
                punti[i]=a;
            }
       
      //System.out.println("colpevole!");
       
        for(int i=1; i<punti.length-1; i++){
         personList.add(punti[i]);
        }
       
       
        //Questa è la lista che rappresenta la sorgente dei dati della listview
        //ogni elemento è una mappa(chiave->valore)
        ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
       
       
        for(int i=1;i<personList.size()-1;i++){
                PuntoVendita p=personList.get(i);// per ogni punto vendita
               
                HashMap<String,Object> personMap=new HashMap<String, Object>();//creiamo una mappa di valori
               
                personMap.put("name", p.getName()); // per la chiave name,l'informazine sul nome
                personMap.put("prezzo", p.getPrezzo());// per la chiave sul prezzo
                personMap.put("ingredienti", p.getIngredienti()); //chiave ingredienti
                data.add(personMap);  //aggiungiamo la mappa di valori alla sorgente dati
                System.out.println(p.getName());
        }
       
       
        String[] from={"name","prezzo"}; //dai valori contenuti in queste chiavi
        int[] to={R.id.pizzaName,R.id.pizzaPrice};//agli id delle view (da singolopunto)
       
        //costruzione dell adapter
        SimpleAdapter adapter=new SimpleAdapter(
                        getApplicationContext(),
                        data,//sorgente dati
                        R.layout.singolopunto, //layout contenente gli id di "to"
                        from,
                        to);
       
        //utilizzo dell'adapter
        ((ListView)findViewById(R.id.personListView)).setAdapter(adapter);
        list = (ListView)findViewById(R.id.personListView);
        list.setOnItemClickListener(this);
    }


        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                      PuntoVendita b = personList.get(position+1);
                String a = b.getIngredienti();
                       
                        Toast tt  = Toast.makeText(getBaseContext(),"Ingredienti: " +a,
                                                Toast.LENGTH_LONG);
                                                tt.show();
                    }
}

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:List View popolato da file di testo
« Risposta #6 il: 16 Giugno 2013, 12:53:44 CEST »
0
avevo risolto mettendo il mio file di testo nella cartella "assets" e funzionava...ho provato a modificare il layout, non ci sono riuscito e sono tornato indietro fino al punto in cui l'applicazione funzionava, ma adesso non va più mi da l'errore "source not found"...sto impazzendo :)
il tuo codice mi è utile, se mi metti anche i codici xml è ancora meglio
non trovo il tasto per dirti "grazie"

mi sono già presentato nell'apposita sezione del forum :)

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #7 il: 16 Giugno 2013, 12:55:18 CEST »
0
il tasto grazie è in alto a destra proprio sopra il mio messaggio.
forse facciamo prima se  disegni il layout che vuoi, e te lo creo, perchè questo per la pizza è molto semplice

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:List View popolato da file di testo
« Risposta #8 il: 16 Giugno 2013, 13:00:48 CEST »
0
visto che sto muovendo i primi passi per me l'importante è capire come far dialogare le classi java e i file xml, capire come vanno collegate le varie voci, ma non fa nulla, continuo a cercare in rete.
per l'errore "source not found" non sai consigliarmi?
trovato il tasto "thanks"

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #9 il: 16 Giugno 2013, 13:09:07 CEST »
+1
nel mio codice mi sembrava chiaro.
comunque tutto quello che è R. è una risorsa
R.id è una risorsa dentro un file xml (tipo R.id.textView1 è una textview)
mentre R.layout è un layout, quindi il file che sarà la vista vera e propria
infine R.raw sono i file che vai a puntare direttamente


questo è il file res/singolopunto.xml (che è il singolo elemento della lista di pizze)
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="60dip"
       android:padding="5dip"
       android:background="@drawable/bianca"
       >




        <TextView
           android:id="@+id/pizzaName"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginLeft="5dip"
           android:text="Nome pizza"
           android:textAppearance="?android:attr/textAppearanceLarge"
           android:singleLine="true"
           android:scrollHorizontally="false"
           android:textColor="#660000">
</TextView>


        <TextView
           android:id="@+id/pizzaPrice"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_alignParentRight="true"
           android:layout_below="@+id/pizzaName"
           android:scrollHorizontally="false"
           android:singleLine="true"
           android:text="Prezzo"
           android:textAppearance="?android:attr/textAppearanceMedium"
           android:textColor="#FF9900" />


</RelativeLayout>


mentre la vista vera e propria è


Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
      >




    <ListView
       android:id="@+id/personListView"
       android:layout_width="fill_parent"
       android:layout_height="250dp"
       android:layout_above="@+id/textView1"
       android:layout_alignParentLeft="true"
       android:layout_below="@+id/textView4" >


    </ListView>


</RelativeLayout>


per il file not found ho troppe poco informazioni.
il file c'è dentro la cartella, o lo punti nel modo giusto?

Offline Namtar

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:List View popolato da file di testo
« Risposta #10 il: 16 Giugno 2013, 13:13:34 CEST »
0
si si, il file c'è e l'applicazione funzionava, leggendo in rete dicono che l'errore viene fuori quando manca qualcosa sul file string.xml anche se io quel file non l'ho modificato

Offline gabric

  • Utente senior
  • ****
  • Post: 613
  • Respect: +18
    • Google+
    • Mostra profilo
    • Brancato's site
  • Dispositivo Android:
    Nexus 5 / Tablet mediacom s4
  • Play Store ID:
    Brancato's+app
  • Sistema operativo:
    window7. ubuntu
Re:List View popolato da file di testo
« Risposta #11 il: 16 Giugno 2013, 13:36:52 CEST »
0
uhm così non ti so dire... cmq se incolli tutto il mio codice ti funziona tutto, e poi lo modifichi in base al tuo bisogno