Autore Topic: Problema con l'update degli elementi di una listview a seguito della modif datab  (Letto 1361 volte)

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Buongiorno ragazzi!
Sto cercando una volta modificato il contenuto del db di aggiornare anche il contenuto della listview a seguito del decremento della quantità di un prodotto..
mi sono creato il metodo
Codice (Java): [Seleziona]
private void updateListView(){
           cursore.requery();
           adaptatore.notifyDataSetChanged();
           
   }

dove adaptatore e cursore solo relativamente il cursor della query e l'adapter utilizzati per la creazione e la popolazione della listview...

solo che quando lo chiamo la listview mi si cancella totalmente e non visualizzo più nulla ed ho il seguente errore nel LOGCAT:
11-06 14:46:32.300: ERROR/Cursor(7938): Invalid statement in fillWindow()

molto probabilmente chiamo il metodo nella posizione sbagliata....
questo è il mio codice completo...
Codice (Java): [Seleziona]
public class Demo extends Activity {
       
        private Activity activity;
        private Cursor cursore;
        private MyAdapter adaptatore;
       
        //public MyDatabase2 db2 = new MyDatabase2(getApplicationContext());;
       
   @Override
    public void onCreate(Bundle savedInstanceState) {
           this.activity=this;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                         
       
        /*ImageView image=(ImageView)findViewById(R.id.ImageView01);
        String myJpgPath = "/mnt/sdcard/frova.jpg";
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
        image.setImageBitmap(bm);
        */

       
        String xmlUrlArticoli="http://ortobotanico.altervista.org/articoli4.xml";
        MyParserArt parserArt=new MyParserArt(); //otteniamo un istanza del nostro parser
        parserArt.parseXml(xmlUrlArticoli);//usiamo il parser
        ArrayList<MyArt> AR2 = new ArrayList<MyArt> (parserArt.getParsedData());
       
       
        String xmlUrlLogSpesa="http://ortobotanico.altervista.org/logspesa.xml";
        MyParserLog parserLog=new MyParserLog(); //otteniamo un istanza del nostro parser
        parserLog.parseXml(xmlUrlLogSpesa);//usiamo il parser
        Vector<LogSpesaBean> LS = new Vector<LogSpesaBean> (parserLog.getParsedDataL());
        //for(int j=1;j<LS.size();j++)
                //Log.i("VECTORLOGSPESABEAN",Integer.toString(LS.get(j).getIDArticolo())+Integer.toString(LS.get(j).getQta()));
       
       
        TextView productsTv=(TextView)findViewById(R.id.productsTv);
        productsTv.setTypeface(Typeface.createFromAsset(getAssets(),"kberry.ttf"));  
        //caricamento di un font esterno, piazzato nella cartella assets
       
        ListView productsLv=(ListView)findViewById(R.id.productsLv);
     
       
        final MyDatabase2 db2=new MyDatabase2(getApplicationContext());
        db2.open();  //apriamo il db
       
        //db2.deleteProdotti();
       
        Cursor e = db2.fetchProducts();
        startManagingCursor(e);
     
       
       
        //Primo inserimento articoli a database vuoto
       
        if(e.getCount()==0)     {
                for(int h=1; h<AR2.size();h++)
                {
             db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getNonCibo(),AR2.get(h).getUri(),AR2.get(h).getChanged(),AR2.get(h).getDataa());       
                }
               
        }
   
       
        //Verifica se la tabella articoli da aggiornare (presenza di un nuovo articolo
        //o di un articolo aggiornato)
       
       else if(e.getCount()!=0 && e.moveToFirst()) {
           
                for(int h=1; h<AR2.size();h++)
                {
                        int mIdIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_ID_KEY);
                int mNameIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                int mDateIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_DATAA_KEY);
                int mUriIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
               
                                if(Integer.parseInt(AR2.get(h).getId())==Integer.parseInt(e.getString(mIdIndex)) && (AR2.get(h).getDataa()>e.getLong(mDateIndex)))
                                {
                                ///Update articolo
                                Log.i("CURSOR_ARTICOLO_ID", (e.getString(mIdIndex)));
                        Log.i("CURSOR_ARTICOLO_NAME", (e.getString(mNameIndex)));
                        Log.i("CURSOR_ARTICOLO_URI", (e.getString(mUriIndex)));
                                db2.updateArticolodbRow(AR2.get(h).getId(), AR2.get(h).getArti(), AR2.get(h).getNonCibo(), AR2.get(h).getUri(), AR2.get(h).getChanged(), AR2.get(h).getDataa());       
                                        if(e.getString(mNameIndex)!=AR2.get(h).getArti())
                                        {
                                                String s = e.getString(mUriIndex).substring(8);
                                                s=s.replaceAll("%20", " ");
                                                File file = new File(s);
                                                boolean delete = file.delete();
                                                Log.i("DELETE THE FILE JPG?", (String.valueOf(delete)));
                                                Log.i("CURSOR_ARTICOLO_URI_ELIMINATA", (e.getString(mUriIndex)));
                                        }
                               
                                Log.i("UPDATED_ARTICOLO_ID",AR2.get(h).getId());
                        Log.i("UPDATED_ARTICOLO_NOME",AR2.get(h).getArti());
                        Log.i("UPDATED_ARTICOLO_URI",AR2.get(h).getUri());
                                }
                               
                                if(Integer.parseInt(AR2.get(h).getId())!=Integer.parseInt(e.getString(mIdIndex)))
                                {
                                //Insert New articolo
                        db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getNonCibo(),AR2.get(h).getUri(),AR2.get(h).getChanged(),AR2.get(h).getDataa());    
                        Log.i("CURSOR_ARTICOLO_ID", (e.getString(mNameIndex)));
                        Log.i("CURSOR_ARTICOLO_NOME", (e.getString(mIdIndex)));
                        Log.i("NEW_ARTICOLO_ID",AR2.get(h).getId());
                        Log.i("NEW_ARTICOLO_NOME",AR2.get(h).getArti());
                                }        
                               
                                e.moveToNext();
                }
               
        }
       
       
        //boolean termina_spesa=false;
       
        db2.deleteLogspesadb();
        Cursor f = db2.fetchLog();
        startManagingCursor(f);
        if(f.getCount()==0){//inserimento dati tabella prodotti
                for(int o=1; o<LS.size();o++)
                {
                          db2.insertLogSpesa(LS.get(o).getIDArticolo(),LS.get(o).getQta());
                }
        }        
       
       
       
        //Salviamo i dati UTILI (IDARTICOLO e QUANTITA dalla tabella LOGSPESADB)
        //aggiornati dal database per poi poterli passare ad un file xml
        //da inviare al server che poi li deserializzerà aggiornando il DATABASE ANFASS

        Vector<LogSpesaBean> result2 = db2.selectLogspesadb();
        for(int u=0;u<result2.size();u++)
        Log.i("CONTENUTO TABELLA LOGSPESA","ID_ART: "+String.valueOf(result2.get(u).getIDArticolo())+"QTA_AR: "+String.valueOf(result2.get(u).getQta()));

        ArrayList<MyArt> result = db2.selectArticoli();
        for(int j=0;j<result.size();j++)
        Log.i("CONTENUTO TABELLA ARTICOLI",result.get(j).getId()+result.get(j).getArti()+result.get(j).getUri());      

        // !!query che ci restituisce tutti i prodotti in lista spesa e li passa ad un Cursor!!
        cursore=db2.fetchProducts2();
        startManagingCursor(cursore);
        adaptatore = new MyAdapter(this, cursore);
        productsLv.setAdapter(adaptatore); //la listview ha questo adapter
       
        db2.close();

       
        AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
                           
                           final int posizione = pos;
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                     
               
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                     
                       options.inSampleSize = 2;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setIcon(R.drawable.carrello);
                       builder.setView(image);
                       builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                           
                                 public void onClick(DialogInterface dialog, int id) {
                         dialog.cancel();  
                     
                     }
                           });
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
                       
                       
                       builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   Cursor r = db2.fetchProducts2();
                                   startManagingCursor(r);
                                   r.moveToPosition(posizione);
                                   int mIdIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);               
                                   int mQtaIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                    db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);
                                    db2.close();
                                dialog.cancel();
                               
                              }
                                       
                                       
                          });
                   builder.create().show();
                   !!!!!!!!!!!!!!!!!!!!!!!!!!updateListView();!!!!!!!!!!!!!!!!!!!!!!!!
                   db2.close();
                   
                   }
                };    
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);
               

        getWindow().setFormat(PixelFormat.RGBA_8888);   //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum)
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);  
       
        productsLv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        productsTv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        //definizione ed uso di gradient in modo programmatico
       
       
        //animazioni in modo programmatico (vedi snippet forum)
        Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a1.setDuration(1000);
        a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsLv.startAnimation(a1);
        //entra dal sotto
       
       
        Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a2.setDuration(1000);
        a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsTv.startAnimation(a2);
        //entra dal sopra
     
       
    } //chiusura void onCreate(Bundle savedInstanceState)
   
   
   class MyAdapter extends ResourceCursorAdapter {

                private int     mNameIndex;
                private int mUriIndex;
                private int mQtaIndex;
                       
               

                public MyAdapter(Context context, Cursor cur) {
           super(context, R.layout.product, cur);
           
           mNameIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
           mUriIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
           mQtaIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
       }



       @Override
                public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
           LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           return li.inflate(R.layout.product, parent, false);
                }



                @Override
       public void bindView(View view, Context context, Cursor cur) {
                        TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear );
                        TextView qtaAr = ( TextView ) view.findViewById( R.id.Qtaar );
                        ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo);
                        nameAr.setText( cur.getString( mNameIndex ) );
                        qtaAr.setText( cur.getString( mQtaIndex ) );
                        imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex )));

       }
               
   
   } //Fine class MyAdapter extends ResourceCursorAdapter
   
   private void updateListView(){
           cursore.requery();
           adaptatore.notifyDataSetChanged();
           
   }
   
   
} //fine public class Demo extends Activity

Il metodo updateListView lo chiamo nel punto tra !!!!!punti esclamativi !!!!!!!!!!!!! ma avviene il problema sopra descritto....grazie per l'aiuto...ciao...
« Ultima modifica: 06 Novembre 2010, 15:57:40 CET da Albe85 »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
0
sarebbe bene che postassi il logcat direttamente, sarebbe di maggiore aiuto.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
0
Il logcat mi dice:

11-08 10:24:56.097: DEBUG/dalvikvm(282): GC_FOR_MALLOC freed 8511 objects / 1063592 bytes in 62ms
11-08 10:24:56.127: ERROR/Cursor(282): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/ch.egsolutions.databasetutorial/databases/lista_spesa1212, table = null, query = select * from logspesadb
11-08 10:24:56.127: ERROR/Cursor(282): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
11-08 10:24:56.127: ERROR/Cursor(282):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1315)
11-08 10:24:56.127: ERROR/Cursor(282):     at ch.egsolutions.databasetutorial.MyDatabase2.selectLogspesadb(MyDatabase2.java:132)
11-08 10:24:56.127: ERROR/Cursor(282):     at ch.egsolutions.databasetutorial.Demo.onCreate(Demo.java:363)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.os.Looper.loop(Looper.java:123)
11-08 10:24:56.127: ERROR/Cursor(282):     at android.app.ActivityThread.main(ActivityThread.java:4627)
11-08 10:24:56.127: ERROR/Cursor(282):     at java.lang.reflect.Method.invokeNative(Native Method)
11-08 10:24:56.127: ERROR/Cursor(282):     at java.lang.reflect.Method.invoke(Method.java:521)
11-08 10:24:56.127: ERROR/Cursor(282):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
11-08 10:24:56.127: ERROR/Cursor(282):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
11-08 10:24:56.127: ERROR/Cursor(282):     at dalvik.system.NativeStart.main(Native Method)
11-08 10:24:56.397: DEBUG/dalvikvm(282): GC_EXTERNAL_ALLOC freed 1708 objects / 227304 bytes in 55ms
11-08 10:24:56.617: DEBUG/dalvikvm(282): GC_EXTERNAL_ALLOC freed 209 objects / 116056 bytes in 61ms
11-08 10:24:57.437: DEBUG/dalvikvm(282): GC_EXTERNAL_ALLOC freed 110 objects / 70768 bytes in 63ms
11-08 10:24:57.487: INFO/ActivityManager(61): Displayed activity ch.egsolutions.databasetutorial/.Demo: 14223 ms (total 14223 ms)
11-08 10:24:59.817: INFO/ARMAssembler(61): generated scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x33f0c0:0x33f17c] in 432318 ns
11-08 10:25:00.866: ERROR/Cursor(282): Invalid statement in fillWindow()
11-08 10:25:00.957: WARN/InputManagerService(61): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43e85888

il problema sul cursore è dovuto a una query che non centra nulla nel contesto del problema dell'update della listview....
il problema che ho è che una volta che vado a fare l'update sulla quantità di un prodotto dopo che clicco su conferma nell'alert dialog, vorrei che mi si aggiornasse la quantità visualizzata sulla listview alla riga corretta ed invece la listview scompare completamente ed ho l'errore

Invalid statement in fillWindow()

invece se chiudo e riapro l'applicazione la quantità viene correttamente aggiornata perchè rifà correttamente la query sul db...
Posto il codice dove tento di fare il cursore.requery();

Codice (Java): [Seleziona]
AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {

                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
                           
                           posizione = pos;
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                     
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 2;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setIcon(R.drawable.carrello);
                       builder.setView(image);
                       
                       builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                           
                                 public void onClick(DialogInterface dialog, int id) {
                         dialog.cancel();  
                     
                     }
                           });
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
                       
                       
                       builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   Cursor r = db2.fetchProducts2();
                                   startManagingCursor(r);
                                   r.moveToPosition(posizione);
                                   int mIdIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);               
                                   int mQtaIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                   db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);

                           cursore.requery();
                           startManagingCursor(cursore);
                           
                           
                                   adaptatore.notifyDataSetChanged();
                                   
                                   db2.close();    

                               dialog.cancel();

                              }
                          });

                   builder.create().show();
                   db2.close();
                   }  
                };     
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);

dove cursore e adaptatore li chiamo prima facendo:
Codice (Java): [Seleziona]
  // !!query che ci restituisce tutti i prodotti in lista spesa e li passa ad un Cursor!!
        cursore=db2.fetchProducts2();
        startManagingCursor(cursore);
        adaptatore = new MyAdapter(this, cursore);
        productsLv.setAdapter(adaptatore);

dove la classe Myadapter è la seguente:
Codice (Java): [Seleziona]
class MyAdapter extends ResourceCursorAdapter {

      // private int    mIdIndex;
                private int     mNameIndex;
                private int mUriIndex;
                private int mQtaIndex;
                       
               

                public MyAdapter(Context context, Cursor cur) {
           super(context, R.layout.product, cur);
           
           //mIdIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_ID_KEY);
           mNameIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
           mUriIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
           mQtaIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
           
           
       }



       @Override
                public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
           LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           return li.inflate(R.layout.product, parent, false);
                }



                @Override
       public void bindView(View view, Context context, Cursor cur) {
                        //TextView idAr = ( TextView ) view.findViewById( R.id.Idar );
                        TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear );
                        TextView qtaAr = ( TextView ) view.findViewById( R.id.Qtaar );
                        ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo);
                       
                        //cur.moveToPosition(posizione);
                       
                        //idAr.setText( cur.getString( mIdIndex ) );
                        nameAr.setText( cur.getString( mNameIndex ) );
                        qtaAr.setText( cur.getString( mQtaIndex ) );
                        imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex )));
                       
               
                       
                       
                        if(Integer.parseInt(cur.getString( mQtaIndex ))==0){
                               
                               
                                ((ListView)findViewById(R.id.productsLv)).setBackgroundResource(R.color.secondo);
                        }

       }
               
               
   
   } //Fine class MyAdapter extends ResourceCursorAdapter

ti ringrazio...ciao!
« Ultima modifica: 08 Novembre 2010, 11:34:56 CET da Albe85 »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
0
Mi concentrerei su questo:

Codice: [Seleziona]
11-08 10:24:56.127: ERROR/Cursor(282): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/ch.egsolutions.databasetutorial/databases/lista_spesa1212, table = null, query = select * from logspesadb
11-08 10:24:56.127: ERROR/Cursor(282): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

Hai controllato se quando fai cursore.requery() ti torna true?
E, comunque, cosa fa updateQuantita?

7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
0
Update quantità fa la seguente cosa:

Codice (Java): [Seleziona]
//Metodo che fa la query per aggiornare una riga della tabella logspesa
         //ed in particolare la quantità da comperare
         public void updateQuantita(int IDARL, int QUANTITA){
                 ContentValues cv4=new ContentValues();
                 cv4.put(ProductsMetaDataLog.PRODUCT_QUANT_KEY, QUANTITA);
                 mDb.update(ProductsMetaDataLog.LOGSPES_TABLE, cv4, "IDARL=" + IDARL, null);
         }

e io lo chiamo facendo:
Codice (Java): [Seleziona]
db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);questo funziona correttamente perchè se io riapro l'applicazione dopo aver usato udatequantità nella listview appare la quantità diminuita di uno.
Io invece vorrei far comparire nella listview tale modifica senza dover chiudere e riaprire l'applicazione.

Per quanto riguarda il requery mi ritorna true e la listview scompare completamente.

Il problema sul cursor è dovuto alla query:
Codice (Java): [Seleziona]
//Metodo per salvare in un ArrayList (results) tutto il contenuto UTILE della
         //tabella articoli (che poi sarà serializzato in XML)
         public Vector<LogSpesaBean> selectLogspesadb() {
         try {
                Vector<LogSpesaBean> results3 = new Vector<LogSpesaBean>();
               
               
                 Cursor c2 = mDb.rawQuery("select * from logspesadb", null);
                 if (c2.getCount() > 0) {
                         c2.moveToFirst();
                                 do {
                                         
                                         LogSpesaBean newLog=new LogSpesaBean();
                                         
                                         newLog.setIDArticolo(Integer.parseInt(c2.getString(c2.getColumnIndex("IDARL"))));
                                         newLog.setQta(Integer.parseInt(c2.getString(c2.getColumnIndex("QUANTITA"))));
                                                                     
                                         results3.add(newLog);      
                               
                                         
                                 } while(c2.moveToNext());
                       
                 }
                 return results3;
                 
         } finally {
                // if (mDb != null)
                         //mDb.close();
         }
 }

che io uso nell'activity nel seguente modo:
Codice (Java): [Seleziona]
//Salviamo i dati UTILI (IDARTICOLO e QUANTITA dalla tabella LOGSPESADB)
            //aggiornati dal database per poi poterli passare ad un file xml
            //da inviare al server che poi li deserializzerà aggiornando il DATABASE ANFASS
                 Vector<LogSpesaBean> result2 = db2.selectLogspesadb();
             for(int u=0;u<result2.size();u++)
             Log.i("CONTENUTO TABELLA LOGSPESA","ID_ART: "+String.valueOf(result2.get(u).getIDArticolo())+"QTA_AR: "+String.valueOf(result2.get(u).getQta()));


e comunque anche commentando questa ultima parte e quindi eliminando l'errore nel logcat sul cursor il problema dell'invalid statement permane... :'(
« Ultima modifica: 08 Novembre 2010, 12:08:22 CET da Albe85 »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
0
hai provato a chiudere il cursore prima di uscire dal metodo?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
0
Anche chiudendo il cursore prima di uscire dal metodo cioè nel seguente modo:

Codice (Java): [Seleziona]
AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
                           
                           //String st = "Clicked POS="+pos+" ID="+id;
                       //Toast.makeText(getApplicationContext(),st,Toast.LENGTH_SHORT).show();
                           
                           posizione = pos;
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                     
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 2;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setIcon(R.drawable.carrello);
                       builder.setView(image);
                       
                       builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                           
                                 public void onClick(DialogInterface dialog, int id) {
                         dialog.cancel();  
                     
                     }
                           });
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
                       
                       
                       builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   Cursor r = db2.fetchProducts2();
                                   startManagingCursor(r);
                                   r.moveToPosition(posizione);
                                   int mIdIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);               
                                   int mQtaIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                   db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);
                                   
                                   
                                 
                           boolean b = cursore.requery();
                           
                           Log.i("REQUERY?", String.valueOf(b));
                           
                           cursore.close();
                          // startManagingCursor(cursore);
                           
                           
                                   adaptatore.notifyDataSetChanged();
                                   
                                   db2.close();    
                                   
                                   
                               dialog.cancel();
                               
                             
                               
                                 
                                    //Log.i("ARTICOLO_ID_QUANT_AGGIORNATA",r.getString(mIdIndex));
                                //Log.i("ARTICOLO_QUANTITA_AGGIORNATA",r.getString(mQtaIndex));
               
                              }
                          });

                   builder.create().show();
                   db2.close();
                   }  
                };     
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);
                       

il problema permane...non riesco proprio a capirne il motivo...
eppure cursore è il cursor che uso da passare all'adapter per popolare la listview e quindi dovrebbe andare...

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
0
dicevo di chiuderlo dentro selectLogspesadb, prima di restituire il valore.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
0
secondo me il problema sul cursor relativo a:
Codice (Java): [Seleziona]
//Metodo per salvare in un ArrayList (results) tutto il contenuto UTILE della
         //tabella articoli (che poi sarà serializzato in XML)
         public Vector<LogSpesaBean> selectLogspesadb() {
         try {
                Vector<LogSpesaBean> results3 = new Vector<LogSpesaBean>();
               
               
                 Cursor c2 = mDb.rawQuery("select * from logspesadb", null);
               
                 if (c2.getCount() > 0) {
                         c2.moveToFirst();
                                 do {
                                         
                                         LogSpesaBean newLog=new LogSpesaBean();
                                         
                                         newLog.setIDArticolo(Integer.parseInt(c2.getString(c2.getColumnIndex("IDARL"))));
                                         newLog.setQta(Integer.parseInt(c2.getString(c2.getColumnIndex("QUANTITA"))));
                                                                     
                                         results3.add(newLog);      
                               
                                         
                                 } while(c2.moveToNext());
                       
                 }
                 return results3;
                 
         } finally {
                // if (mDb != null)
                         //mDb.close();
         }
 }
non va ad incidere su "cursore". La parte dove uso la query selectLogspesadb() l'ho eliminata dall'activity ma il problema che vedo la listview vuota rimane lo stesso quando faccio il requery su "cursore".
La query associata a cursore è la seguente:
Codice (Java): [Seleziona]
//metodo per fare la query di alcuni specificati elementi della tabella articolo e della tabella logspesadb dove prodotti.IDARA=logspesadb.IDARL
        //Con questa query creiamo la lista della spesa vera e propria
        public Cursor fetchProducts2(){
                return mDb.rawQuery("SELECT prodotti._id,logspesadb._id2,prodotti.NOMEAR,prodotti.URIIMG,logspesadb.QUANTITA,logspesadb.IDARL FROM prodotti,logspesadb WHERE prodotti.IDARA=logspesadb.IDARL", null);
               
        }

che io nell'activity uso nel seguente modo:
cursore=db2.fetchProducts2();
        startManagingCursor(cursore);
        adaptatore = new MyAdapter(this, cursore);
        productsLv.setAdapter(adaptatore); //la listview ha questo adapter

e quando provo a farne cursore.requery() dopo aver aggiornato la quantità la listview è vuota ed ho l'unico errore nel logcat  che è:
11-08 12:51:37.917: ERROR/Cursor(576): Invalid statement in fillWindow()
11-08 12:51:37.917: INFO/REQUERY?(576): true
11-08 12:51:38.027: WARN/InputManagerService(61): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43f81380

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
0
Il db non è chiuso in quel momento, giusto?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Problema con l'update degli elementi di una listview a seguito della modif datab
« Risposta #10 il: 08 Novembre 2010, 14:52:22 CET »
0
Secondo me ho fatto casino con aperture e chiusure del db....
ti posto tutto il codice dell'activity:
Codice (Java): [Seleziona]
package ch.egsolutions.databasetutorial;

import java.util.ArrayList;
import java.util.Vector;


import agenda.bean.BaseBean;
import agenda.bean.LogSpesaBean;
import agenda.bean.XmlWriter;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentProviderOperation.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ResourceCursorAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;







import android.util.Log;


public class Demo extends Activity {
       
        private Activity activity;
        private Cursor cursore;
        private MyAdapter adaptatore;
        private MyDatabase2 db2;
        private int posizione;
        //public MyDatabase2 db2 = new MyDatabase2(getApplicationContext());;
       
   @Override
    public void onCreate(Bundle savedInstanceState) {
           this.activity=this;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                         
 
       
        String xmlUrlArticoli="http://ortobotanico.altervista.org/articoli4.xml";
        MyParserArt parserArt=new MyParserArt(); //otteniamo un istanza del nostro parser
        parserArt.parseXml(xmlUrlArticoli);//usiamo il parser
        ArrayList<MyArt> AR2 = new ArrayList<MyArt> (parserArt.getParsedData());
       
       
        String xmlUrlLogSpesa="http://ortobotanico.altervista.org/logspesa.xml";
        MyParserLog parserLog=new MyParserLog(); //otteniamo un istanza del nostro parser
        parserLog.parseXml(xmlUrlLogSpesa);//usiamo il parser
        Vector<LogSpesaBean> LS = new Vector<LogSpesaBean> (parserLog.getParsedDataL());

        TextView productsTv=(TextView)findViewById(R.id.productsTv);
        productsTv.setTypeface(Typeface.createFromAsset(getAssets(),"kberry.ttf"));  
        //caricamento di un font esterno, piazzato nella cartella assets
       
        ListView productsLv=(ListView)findViewById(R.id.productsLv);

        db2=new MyDatabase2(getApplicationContext());
        db2.open();  //apriamo il db

        Cursor e = db2.fetchProducts();
        startManagingCursor(e);

        //Primo inserimento articoli a database vuoto
       
        if(e.getCount()==0)     {
                for(int h=1; h<AR2.size();h++)
                {
             db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getNonCibo(),AR2.get(h).getUri(),AR2.get(h).getChanged(),AR2.get(h).getDataa());       
                }
               
        }
   
       
        //Verifica se la tabella articoli da aggiornare (presenza di un nuovo articolo
        //o di un articolo aggiornato)
       
       else if(e.getCount()!=0 && e.moveToFirst()) {
           
                for(int h=1; h<AR2.size();h++)
                {
                        int mIdIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_ID_KEY);
                int mNameIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                int mDateIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_DATAA_KEY);
                int mUriIndex = e.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
               
                                if(Integer.parseInt(AR2.get(h).getId())==Integer.parseInt(e.getString(mIdIndex)) && (AR2.get(h).getDataa()>e.getLong(mDateIndex)))
                                {
                                ///Update articolo
                                Log.i("CURSOR_ARTICOLO_ID", (e.getString(mIdIndex)));
                        Log.i("CURSOR_ARTICOLO_NAME", (e.getString(mNameIndex)));
                        Log.i("CURSOR_ARTICOLO_URI", (e.getString(mUriIndex)));
                                db2.updateArticolodbRow(AR2.get(h).getId(), AR2.get(h).getArti(), AR2.get(h).getNonCibo(), AR2.get(h).getUri(), AR2.get(h).getChanged(), AR2.get(h).getDataa());       
                                        if(e.getString(mNameIndex)!=AR2.get(h).getArti())
                                        {
                                                String s = e.getString(mUriIndex).substring(8);
                                                s=s.replaceAll("%20", " ");
                                                File file = new File(s);
                                                boolean delete = file.delete();
                                                Log.i("DELETE THE FILE JPG?", (String.valueOf(delete)));
                                                Log.i("CURSOR_ARTICOLO_URI_ELIMINATA", (e.getString(mUriIndex)));
                                        }
                               
                                Log.i("UPDATED_ARTICOLO_ID",AR2.get(h).getId());
                        Log.i("UPDATED_ARTICOLO_NOME",AR2.get(h).getArti());
                        Log.i("UPDATED_ARTICOLO_URI",AR2.get(h).getUri());
                                }
                               
                                if(Integer.parseInt(AR2.get(h).getId())!=Integer.parseInt(e.getString(mIdIndex)))
                                {
                                //Insert New articolo
                        db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getNonCibo(),AR2.get(h).getUri(),AR2.get(h).getChanged(),AR2.get(h).getDataa());    
                        Log.i("CURSOR_ARTICOLO_ID", (e.getString(mNameIndex)));
                        Log.i("CURSOR_ARTICOLO_NOME", (e.getString(mIdIndex)));
                        Log.i("NEW_ARTICOLO_ID",AR2.get(h).getId());
                        Log.i("NEW_ARTICOLO_NOME",AR2.get(h).getArti());
                                }        
                               
                                e.moveToNext();
                }
               
        }
       

       boolean termina_spesa=false;
       
       
        Cursor f = db2.fetchLog();
        startManagingCursor(f);
       
       
        if(f.getCount()==0){//inserimento dati tabella logspesa in caso tabella vuota
                for(int o=1; o<LS.size();o++)
                {
                          db2.insertLogSpesa(LS.get(o).getIDArticolo(),LS.get(o).getQta());
                }
               
        }else if(e.getCount()!=0 && e.moveToFirst() && termina_spesa==true) { //inserimento dati tabella logspesa in caso tabella piena e spesa terminata
                //dopo pressione button termina spesa in cui viene settato termina_spesa = true
                db2.deleteLogspesadb();
                for(int o=1; o<LS.size();o++)
                {
                          db2.insertLogSpesa(LS.get(o).getIDArticolo(),LS.get(o).getQta());
                }
                termina_spesa=false;
        }
        else if(e.getCount()!=0) {
                e.moveToFirst();
        }
       
               
   
        // !!query che ci restituisce tutti i prodotti in lista spesa e li passa ad un Cursor!!
        cursore=db2.fetchProducts2();
        startManagingCursor(cursore);
        adaptatore = new MyAdapter(this, cursore);
        productsLv.setAdapter(adaptatore); //la listview ha questo adapter


        AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {

                           posizione = pos;
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                     
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 2;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setIcon(R.drawable.carrello);
                       builder.setView(image);
                       
                       builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                           
                                 public void onClick(DialogInterface dialog, int id) {
                         dialog.cancel();  
                     
                     }
                           });
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
                       
                       
                       builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   Cursor r = db2.fetchProducts2();
                                   startManagingCursor(r);
                                   r.moveToPosition(posizione);
                                   int mIdIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);               
                                   int mQtaIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                   db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);
                                   
                                   
                                 
                           boolean b = cursore.requery();
                           
                           Log.i("REQUERY?", String.valueOf(b));
                           startManagingCursor(cursore);
                           
                          // startManagingCursor(cursore);
                           
                           
                                   adaptatore.notifyDataSetChanged();
                                   cursore.close();
                                   db2.close();    
                                   
                                   
                               dialog.cancel();
                               
                              }
                          });

                   builder.create().show();
                   db2.close();
                   }  
                };     
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);
                       

                        db2.close();

     
        getWindow().setFormat(PixelFormat.RGBA_8888);   //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum)
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);  
       
        productsLv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        productsTv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        //definizione ed uso di gradient in modo programmatico
       
       
        //animazioni in modo programmatico (vedi snippet forum)
        Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a1.setDuration(1000);
        a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsLv.startAnimation(a1);
        //entra dal sotto
       
       
        Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a2.setDuration(1000);
        a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsTv.startAnimation(a2);
        //entra dal sopra
     
       
    } //chiusura void onCreate(Bundle savedInstanceState)
   
   
   class MyAdapter extends ResourceCursorAdapter {

      // private int    mIdIndex;
                private int     mNameIndex;
                private int mUriIndex;
                private int mQtaIndex;
                       

                public MyAdapter(Context context, Cursor cur) {
           super(context, R.layout.product, cur);
           
           //mIdIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_ID_KEY);
           mNameIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
           mUriIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
           mQtaIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
           
           
       }



       @Override
                public View newView ( Context context, Cursor cursor, ViewGroup parent ) {
           LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           return li.inflate(R.layout.product, parent, false);
                }



                @Override
       public void bindView(View view, Context context, Cursor cur) {
                        TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear );
                        TextView qtaAr = ( TextView ) view.findViewById( R.id.Qtaar );
                        ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo);

                        nameAr.setText( cur.getString( mNameIndex ) );
                        qtaAr.setText( cur.getString( mQtaIndex ) );
                        imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex )));
                       

                        if(Integer.parseInt(cur.getString( mQtaIndex ))==0){

                               
                        }

       }
               
               
   
   } //Fine class MyAdapter extends ResourceCursorAdapter
 

   
    public boolean onCreateOptionsMenu(Menu menu) {
                // Accediamo agli eventuali MenuItem di sistema
                super.onCreateOptionsMenu(menu);
               
                // Impostiamo l'ordine iniziale
                int order = Menu.FIRST;
                // Creiamo il primo gruppo di MenuItem
                int GROUPA = 0;
                menu.add(GROUPA, 0, order++, "ItemA1");
                menu.add(GROUPA, 1, order++, "ItemA2");
                // Creiamo il secondo gruppo che è checkable. NOTIAMO COME
                // MenuItem di questo tipo non possano essere checkable e quindi
                // tale impostazione venga ignorata
                int GROUPB = 1;
                menu.add(GROUPB, 2, order++, "ItemB1").setCheckable(true);
                menu.add(GROUPB, 3, order++, "ItemB2").setCheckable(true);
                // Creiamo il terzo gruppo
                int GROUPC = 2;
                menu.add(GROUPC, 4, order++, "ItemC1").setIcon(R.drawable.icon);
                menu.add(GROUPC, 5, order++, "ItemC2");        
                // Visualizziamo il Menu
                return true;
        }
   
   
   
   
   
} //fine public class Demo extends Activity
« Ultima modifica: 08 Novembre 2010, 14:55:31 CET da Albe85 »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema con l'update degli elementi di una listview a seguito della modif datab
« Risposta #11 il: 08 Novembre 2010, 15:31:12 CET »
0
Riga 220 del codice:

Codice (Java): [Seleziona]
 db2.open();
Cursor r = db2.fetchProducts2();
startManagingCursor(r);
r.moveToPosition(posizione);
int mIdIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);              
int mQtaIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
db2.updateQuantita(Integer.parseInt(r.getString(mIdIndex)), Integer.parseInt(r.getString(mQtaIndex))-1);

boolean b = cursore.requery();
Log.i("REQUERY?", String.valueOf(b));
startManagingCursor(cursore);
adaptatore.notifyDataSetChanged();
cursore.close();
db2.close();

Definisci Cursor r, ma successivamente, quando invochi una requery, usi cursore e non r che hai appena definito.
Poiché quando invochi il listener (click) il tuo db è già chiuso, ti dà errore.

Dovrebbe essere questo il problema.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Problema con l'update degli elementi di una listview a seguito della modif datab
« Risposta #12 il: 08 Novembre 2010, 15:42:25 CET »
0
Quindi dovrei togliere r e continuare ad utilizzare cursore in questo modo?
Codice (Java): [Seleziona]
AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
               
                       
               
                   public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
                           
                           //String st = "Clicked POS="+pos+" ID="+id;
                       //Toast.makeText(getApplicationContext(),st,Toast.LENGTH_SHORT).show();
                           
                           posizione = pos;
                       db2.open();
                           Cursor r = db2.fetchProducts2();
                           startManagingCursor(r);
                           r.moveToPosition(pos);
                           
                           int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
                           int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
                                     
                       ImageView image = new ImageView(activity);  
                       AlertDialog.Builder builder = new AlertDialog.Builder(activity);
                     
                       String s = r.getString(mUriIndex).substring(8);
                       s=s.replaceAll("%20", " ");
                       String myJpgPath = s;
                       BitmapFactory.Options options = new BitmapFactory.Options();
                       options.inSampleSize = 2;           
                       Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
                       image.setImageBitmap(bm); //Sostituisci la tua bitmap
                       builder.setTitle("Conferma Acquisto");
                       builder.setIcon(R.drawable.carrello);
                       builder.setView(image);
                       
                       builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
                           
                                 public void onClick(DialogInterface dialog, int id) {
                         dialog.cancel();  
                     
                     }
                           });
                           
                       builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
                       
                       
                       builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   
                                   
                                   cursore.moveToPosition(posizione);
                                   int mIdIndex =cursore.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);                  
                                   int mQtaIndex =cursore.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                   db2.updateQuantita(Integer.parseInt(cursore.getString(mIdIndex)), Integer.parseInt(cursore.getString(mQtaIndex))-1);
                                   
                                   adaptatore.notifyDataSetChanged();
                                   
                                 
                           boolean b = cursore.requery();
                           
                           Log.i("REQUERY?", String.valueOf(b));
               
                                 
                                   db2.close();    
                                   
                                   
                               dialog.cancel();
                               

                              }
                          });

                   builder.create().show();
                   db2.close();
                   }  
                };     
                ((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);

comunque il db rimane aperto...lo chiudo quasi in fondo al codice....
« Ultima modifica: 08 Novembre 2010, 15:45:14 CET da Albe85 »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Problema con l'update degli elementi di una listview a seguito della modif datab
« Risposta #13 il: 08 Novembre 2010, 15:51:46 CET »
0
All'interno del listener utilizza il nuovo cursor r.

Il fatto che tu chiuda il db alla fine del codice, non vuol dire che in quel momento sia aperto, perché quello che viene eseguito è composto da diverse parti che non necessariamente cominciano in istanti sequenziali.
Quando arrivi alla fine del codice, chiudi il db, dopo che hai fatto una serie di inizializzazioni.
Ma il click listener che hai creato, rimane comunque in ascolto.
Una volta che hai chiuso il db, e con lui il cursor, al click non avrai più dei dati consistenti.
Spero di essere stato chiaro.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Problema con l'update degli elementi di una listview a seguito della modif datab
« Risposta #14 il: 08 Novembre 2010, 16:17:57 CET »
0
chiarissimo il problema l'ho capito....però non so perchè anche facendo come dici non va...

Codice (Java): [Seleziona]
builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
                                             
                           public void onClick(DialogInterface dialog, int id) {
                           
                                   db2.open();
                                   Cursor f = db2.fetchProducts2();
                                   startManagingCursor(f);
                                   f.moveToPosition(posizione);
                                   int mIdIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);               
                                   int mQtaIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
                                   
                                   db2.updateQuantita(Integer.parseInt(f.getString(mIdIndex)), Integer.parseInt(f.getString(mQtaIndex))-1);
                                   
                                   boolean b = f.requery();
                           
                           Log.i("REQUERY?", String.valueOf(b));
                                   adaptatore.notifyDataSetChanged();
                                   
                                  //activity.onContentChanged();
                           

                                   db2.close();    
                               dialog.cancel();
                       
                                 
                                    //Log.i("ARTICOLO_ID_QUANT_AGGIORNATA",r.getString(mIdIndex));
                                //Log.i("ARTICOLO_QUANTITA_AGGIORNATA",r.getString(mQtaIndex));
               
                              }
                           
                          });

                   builder.create().show();
                   db2.close();
                   }  

e sul requery mi da true, non mi da l'errore nel logcat ma non funziona lo stesso, non aggiorna la listview  :'(