Autore Topic: Visualizzazione ListView  (Letto 1437 volte)

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Visualizzazione ListView
« il: 25 Aprile 2013, 11:55:15 CEST »
0
Salve ragazzi avrei un problema. Devo caricare da un database che ho creato gli elementi ed inserirli in una listview in cui ogni riga è formata da Data e città e fare in modo che cliccando compaiano gli altri campi di quella riga del database(una cosa banale credevo :D ).
Il problema è che non visualizzo nulla...questo è il codice


Codice visualizzazione lista nell'activity
Codice: [Seleziona]
public class VisualizzaActivity extends Activity {

        private DbAdapter dbHelper;
    private Cursor c;
   
        @SuppressWarnings("deprecation")
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_visualizza);   
               
                dbHelper = new DbAdapter(this);
        dbHelper.open();
        c = dbHelper.fetchAllContacts();
       
        Log.i("Numero righe: ", Integer.toString(c.getCount()) );
        ListView lvReport=(ListView)findViewById(R.id.listaReport);
            startManagingCursor(c);
           
            SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
                        this,
                        R.layout.lista, //il layout di ogni riga/prodotto
                        c,
                        new String[]{DbAdapter.KEY_DATA,DbAdapter.KEY_CITTA},//questi colonne
                        new int[]{R.id.textViewData,R.id.textViewCitta});//in queste views

           
        lvReport.setAdapter(adapter);
       
       
       
   
        //while ( c.moveToNext() ) {
           
          //  String data = c.getString( c.getColumnIndex(DbAdapter.KEY_DATA) );
          //  Log.i("Data = " , data); 
           
        //}           
        c.close();
       
        lvReport.setClickable(true);
       
        dbHelper.close();
           
        }
   



       

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.visualizza, menu);
                return true;
        }

}


Xml lista
Codice (XML): [Seleziona]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >



        <ListView
                android:id="@+id/listaReport"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:cacheColorHint="#00000000"
                android:dividerHeight="2dp"
       
               
        ></ListView>
</LinearLayout>

xml per ogni riga della lista
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <TextView
       android:id="@+id/textViewData"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentTop="true"
       android:layout_marginLeft="14dp"
       android:layout_marginTop="20dp"
       android:text="Data"
       android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
       android:id="@+id/textViewCitta"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignLeft="@+id/textViewData"
       android:layout_below="@+id/textViewData"
       android:text="Citta"
       android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

Metto anche parte del database, ma a caricare carica perchè nel log della visualizza mi da la data
Codice: [Seleziona]
public class DbAdapter {
        @SuppressWarnings("unused")
        private static final String LOG_TAG = DbAdapter.class.getSimpleName();

        private Context context;
        private SQLiteDatabase database;
        private DatabaseHelper dbHelper;

        // Database fields
        private static final String DATABASE_TABLE      = "diario";


        public static final String KEY_CONTACTID = "_id";
        public static final String KEY_DATA = "data";
        public static final String KEY_CITTA = "citta";
        public static final String KEY_INDIRIZZO = "indirizzo";
        public static final String KEY_EXTRA = "extra";
        public static final String KEY_METEO = "meteo";
        public static final String KEY_TEMPERATURA = "temperatura";
        public static final String KEY_RATING = "rating";
        public static final String KEY_CATTURA = "cattura";

        public DbAdapter(Context context) {
                this.context = context;
        }

        public DbAdapter open() throws SQLException {
                dbHelper = new DatabaseHelper(context);
                database = dbHelper.getWritableDatabase();
                return this;
        }

        public void close() {
                dbHelper.close();
        }

        private ContentValues createContentValues(String data, String citta,String indirizzo, String extra, String meteo, String temperatura, String rating, String cattura ) {
                ContentValues values = new ContentValues();
                values.put( KEY_DATA, data );
                values.put( KEY_CITTA, citta );
                values.put( KEY_INDIRIZZO, indirizzo );
                values.put( KEY_EXTRA, extra );
                values.put( KEY_METEO, meteo );
                values.put( KEY_TEMPERATURA, temperatura );
                values.put( KEY_RATING, rating );
                values.put( KEY_CATTURA, cattura );
                return values;
        }
       
        //create a contact
        public long createCattura(String data,String citta, String indirizzo, String extra, String meteo, String temperatura, String rating, String cattura ) {
                ContentValues initialValues = createContentValues(data, citta, indirizzo,  extra,  meteo,  temperatura,  rating,  cattura);
                Log.i("Riga inserimento:",data+ citta+ indirizzo+  extra+  meteo+  temperatura+  rating+  cattura);
                return database.insert(DATABASE_TABLE, null, initialValues);
        }

       

        //delete a contact     
        public boolean deleteCattura(long contactID) {
                return database.delete(DATABASE_TABLE, KEY_CONTACTID + "=" + contactID, null) > 0;
        }

       
       
        //fetch all contacts
          public Cursor fetchAllContacts() {
                 return database.query(DATABASE_TABLE, null,null,null,null,null,null);
            //return database.query(DATABASE_TABLE, new String[] { KEY_CONTACTID, KEY_DATA,KEY_CITTA,KEY_INDIRIZZO,KEY_EXTRA,
                            //KEY_METEO, KEY_TEMPERATURA,KEY_RATING,KEY_CATTURA}, null, null, null, null, null);
          }
}


Help me  :'(

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #1 il: 25 Aprile 2013, 12:18:45 CEST »
+1
Tu passi il cursor all'adapter, ma subito dopo lo chiudi. Come fa l'adapter a recuperare i dati?
Inoltre, anche se questo non é il problema, stai utilizzando vari metodi deprecati che non andrebbero usati.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #2 il: 25 Aprile 2013, 12:43:34 CEST »
0
in effetti perchè lo chjiudevo...ora visualizza.
Per i metodi deprecati ho,seguendo le guide , inserito startManagingCursor(c) e SimpleCursorAdapter, devo sostituirli entrambi ora ...

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #3 il: 25 Aprile 2013, 12:53:24 CEST »
0
in effetti perchè lo chjiudevo...ora visualizza.
Per i metodi deprecati ho,seguendo le guide , inserito startManagingCursor(c) e SimpleCursorAdapter, devo sostituirli entrambi ora ...
Il SimpleCursorAdapter non é deprecato. Quello che é deprecato é il costruttore che stai usando. Dovresti usare questo:
Codice (Java): [Seleziona]
SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags)con la support library se ti serve la compatibilità con API<11.
Inoltre il metodo moderno per prevede l'utilizzo di CursorLoader, come spiegato in questo tutorial.
« Ultima modifica: 25 Aprile 2013, 12:55:20 CEST da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #4 il: 25 Aprile 2013, 15:11:58 CEST »
0
devo cambiare praticamente tutto il database per fare Content Providers + CursorLoaders   :-\

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #5 il: 25 Aprile 2013, 15:58:50 CEST »
0
Il database veramente è l'unica cosa che rimane uguale.. Quello che cambia è il modo in cui ci accedi.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #6 il: 26 Aprile 2013, 14:16:01 CEST »
0
ho cambiato seguendo la guida, ora mi sono fermato a quest'errore quando lancio la visualizzazione

Codice: [Seleziona]
04-26 12:07:26.768: E/AndroidRuntime(20899): FATAL EXCEPTION: main
04-26 12:07:26.768: E/AndroidRuntime(20899): java.lang.IllegalArgumentException: column '_id' does not exist
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.widget.CursorAdapter.swapCursor(CursorAdapter.java:344)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:326)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at com.example.diariodelpescatore.VisualizzaActivity.onLoadFinished(VisualizzaActivity.java:62)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at com.example.diariodelpescatore.VisualizzaActivity.onLoadFinished(VisualizzaActivity.java:1)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.Loader.deliverResult(Loader.java:103)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:81)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:35)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.os.Looper.loop(Looper.java:137)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at android.app.ActivityThread.main(ActivityThread.java:5041)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at java.lang.reflect.Method.invokeNative(Native Method)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at java.lang.reflect.Method.invoke(Method.java:511)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-26 12:07:26.768: E/AndroidRuntime(20899):         at dalvik.system.NativeStart.main(Native Method)

ho rifatto le activity ed il db così

Codice: [Seleziona]
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.widget.ListView;

public class VisualizzaActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
        private static final int LOADER_ID = 1;
       
    private SimpleCursorAdapter dataSource; // cursor adapter automatico
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_visualizza);   
               
                getSupportLoaderManager().initLoader(LOADER_ID, null, this);
                dataSource = new SimpleCursorAdapter(getApplicationContext(),
                                R.layout.lista, //il layout di ogni riga/prodotto
                        null,
                        new String[]{"data","citta"},//queste colonne
                        new int[]{R.id.textViewData,R.id.textViewCitta},SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);

                ListView myList = (ListView)findViewById(R.id.listaReport);
                myList.setAdapter(dataSource);
               
       
           
        }
   
        /*protected void onListItemClick(ListView l, View v, final int position,
            long id) {
                       
        }*/


       

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.visualizza, menu);
                return true;
        }

        @Override
        public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
                CursorLoader cl = new CursorLoader(getApplicationContext(),MyContentProvider.NOTE_CONTENT_URI,
                                new String[]{"data","citta"},null,null,null);
               
                return cl;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
                dataSource.swapCursor(c);
               
        }

        @Override
        public void onLoaderReset(Loader<Cursor> arg0) {
                dataSource.swapCursor(null);               
        }

}

Codice: [Seleziona]
package com.example.diariodelpescatore;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHelper extends SQLiteOpenHelper {
   
    private static final String DATABASE_NAME = "mydatabase.db";
    private static final int DATABASE_VERSION = 1;
    public static final String TABLE_NAME = "diario";
    public static final String COLUMN_ID = "_id"; //è necessario usare questo nome per la colonna id, altrimenti i cursor adapter non funzioneranno

    // Lo statement SQL di creazione del database
    private static final String DATABASE_CREATE ="create table "
                      + TABLE_NAME + " (" + COLUMN_ID
                      + " integer primary key autoincrement, data text not null , citta text not null, indirizzo text not null, extra text not null, meteo text not null, temperatura text not null, rating text not null, cattura text not null '')"; /*"create table diario (_id integer primary key autoincrement, data text not null , citta text not null, indirizzo text not null, extra text not null, meteo text not null, temperatura text not null, rating text not null, cattura text not null);";*/

   
  //sigleton: solo un'istanza dell'helper
    private static DatabaseHelper helper;
   
    public static DatabaseHelper getHelper(Context c){
            if(helper == null)
                    helper = new DatabaseHelper(c);
           
            return helper;
    }
    // Costruttore
    private DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

   
    // Questo metodo viene chiamato durante la creazione del database
    @Override
    public void onCreate(SQLiteDatabase database) {
            database.execSQL(DATABASE_CREATE);
    }

    // Questo metodo viene chiamato durante l'upgrade del database, ad esempio quando viene incrementato il numero di versione
    @Override
    public void onUpgrade( SQLiteDatabase database, int oldVersion, int newVersion ) {
             
            database.execSQL("DROP TABLE IF EXISTS diario");
            onCreate(database);
             
    }


}

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #7 il: 26 Aprile 2013, 14:34:06 CEST »
0
L'errore mi pare chiaro
Citazione
java.lang.IllegalArgumentException: column '_id' does not exist

Con questa riga
Codice (Java): [Seleziona]
CursorLoader cl = new CursorLoader(getApplicationContext(),MyContentProvider.NOTE_CONTENT_URI,
               new String[]{"data","citta"},null,null,null);
Stai proiettando solo le colonne data e città, quindi il cursor non conterrà la colonna _id.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #8 il: 26 Aprile 2013, 15:05:35 CEST »
0
il mio obiettivo è proprio visualizzare solo data e città nella lista...ho corretto inserendo tutti i campi li, ora visualizzo(non so perchè ma molto molto chiaro però).
Siccome cliccando voglio far visualizzare tutti i campi, mi conviene fare una query con tutti i valori già prima quando visualizzo o rifare la query una volta cliccato?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #9 il: 26 Aprile 2013, 16:20:59 CEST »
0
Come c'é scritto qui nel tuo codice
Codice (Java): [Seleziona]
public static final String COLUMN_ID = "_id"; //è necessario usare questo nome per la colonna id, altrimenti i cursor adapter non funzionerannoil cursor adapter necessita di quella colonna per funzionare. Per questo ora funziona.
La query, dato che essendo un'operazione di I/O é lenta, é meglio farla prima, altrimenti rischi lag ad ogni tap.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #10 il: 27 Aprile 2013, 16:26:53 CEST »
0
okkk, ho aggiunto anche il listner al click e constatato che funziona, ma per farla prima come faccio?
Dovrei fare una query al database in cui prendo tutto e lo salvo tipo in una matrice?Perchè prima mostro data e luogo e se clicco sopra vado in una activity in cui mostro tutto e magari si può modificare

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #11 il: 27 Aprile 2013, 17:50:22 CEST »
0
Perché in una matrice? Il cursor non ti basta?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #12 il: 27 Aprile 2013, 18:04:50 CEST »
0
credo va bene, quindi oltre al cursorSimpleAdapter mi creo un cursor che mi restituisce l'intero database?Questo nella stessa classe, poi come passo i valori all'altra activity?Mi sto perdendo :D

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:Visualizzazione ListView
« Risposta #13 il: 27 Aprile 2013, 20:32:38 CEST »
0
credo va bene, quindi oltre al cursorSimpleAdapter mi creo un cursor che mi restituisce l'intero database?Questo nella stessa classe, poi come passo i valori all'altra activity?Mi sto perdendo :D
Ti serve solo un cursor in cui metti tutti i dati. Questo cursor lo passi al CursorAdapter a cui farai visualizzare però solo le colonne che ti interessano, e da questo stesso cursor ricevi i dati che ti servono al click.
Postate il LogCat LogCat LogCat LogCat LogCat

Offline lucacali87

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    lg dual
  • Sistema operativo:
    windows seven
Re:Visualizzazione ListView
« Risposta #14 il: 29 Aprile 2013, 17:08:05 CEST »
0
fatto proprio così, ma come passo il cursor alla nuova activity che si occupa di visualizzare gli altri valori(putextra non permette il cursor, dovrei passare tutti i valori come stringa?)?COme mai secondo te vedo così?
[IMG=http://img802.imageshack.us/img802/4428/immagineykx.png][/IMG]