JavascriptProva

Visualizzazione post con etichetta database:_delete. Mostra tutti i post
Visualizzazione post con etichetta database:_delete. Mostra tutti i post

mercoledì 30 novembre 2016

Cancellare un record in risposta a un long click sulla ListView

Obiettivo: Cancellare un record in risposta a un long click sulla ListView.
Costruire nell'ambito dell'Helper la funzione che cancella un record dalla tabella del database.

    //funzione che cancella un record dalla tabella tblnomi del database
    public void cancella(String s){
        SQLiteDatabase db=this.getWritableDatabase();
        db.delete("tblnomi","nome=?",new String[]{s});

    }
Adesso la uso:
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                helper.cancella("Giuseppe");
                return true;
            }
        });
Al long click di qualunque elemento della ListView dovrei avere la cancellazione del record il cui campo "nome" equivale a "Giuseppe".
Proviamolo...

Sì, me lo ha cancellato.
Ho dimenticato di ricaricare l'adapter, però:
Procedo (con un altro nome perché di Giuseppe ce n'era uno solo).
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                helper.cancella("Giovanni");
                Cursor c=helper.queryTotale(editNome.getText().toString(),editCognome.getText().toString());
                crs=myCursorAdapter.swapCursor(c);
                return true;
            }
        });
Sì, funziona.

Ora devo però rendere la cosa specifica: devo risalire al nome riportato nell'elemento della listView.
Ecco, dopo aver trovato e sperimentato il modo di accedere alle textView in cui sono riportati nome e cognome, modifico la funzione di helper in modo da includere anche il cognome:
    //funzione che cancella un record dalla tabella tblnomi del database
    public void cancella(String n, String c){
        SQLiteDatabase db=this.getWritableDatabase();
        db.delete("tblnomi","nome=? and cognome=?",new String[]{n,c});
...e riscrivo la funzione in Main:
        listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView parent, View view, int position, long id) {
                TextView txtNome=(TextView)view.findViewById(R.id.txtNome);
                TextView txtCognome=(TextView)view.findViewById(R.id.txtCognome);
                helper.cancella(txtNome.getText().toString(),txtCognome.getText().toString());
                Cursor c=helper.queryTotale(editNome.getText().toString(),editCognome.getText().toString());
                crs=myCursorAdapter.swapCursor(c);
                return true;
            }
        });
Vediamo se funziona...

Funziona egregiamente!!! Obiettivo raggiunto!

mercoledì 24 febbraio 2016

Funzioni di cancellazione di immagini dalla mia applicazione

Se viene toccata l'immagine si attiva il pulsante "Cancella".
Metto una variabile ActiveOne di tipo Layout e lo imposto al valore del Layout toccato o, se viene cliccato lo sfondo, a null.
Creo la variabile...
...

 int openFlag=0;
 boolean settingMode=false;
 String currentCat;
 int mlX;
 int mlY;
 LinearLayout ActiveOne;

...
Inserisco in ACTIVE_DOWN dell'OnTouch il codice che la imposta:
    case MotionEvent.ACTION_DOWN:
     if(settingMode){
      scrollView.requestDisallowInterceptTouchEvent(true);
      RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)v.getLayoutParams();
      DeltaX=X-lp.leftMargin;
      DeltaY=Y-lp.topMargin;
      ActiveOne=(LinearLayout)v;
     }
     break;
...e inserisco il comando che annulla ActiveOne quando viene toccato lo sfondo:
  mainLayout.setOnTouchListener(new View.OnTouchListener() {
   
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    mlX=(int)event.getX();
    mlY=(int)event.getY();
    scrollView.requestDisallowInterceptTouchEvent(false);
    ActiveOne=null;
    return false;
   }
  });


Insieme al toccamento di un'immagine va fatto apparire il bottone per cancellarla:
    case MotionEvent.ACTION_DOWN:
     if(settingMode){
      scrollView.requestDisallowInterceptTouchEvent(true);
      RelativeLayout.LayoutParams lp=(RelativeLayout.LayoutParams)v.getLayoutParams();
      DeltaX=X-lp.leftMargin;
      DeltaY=Y-lp.topMargin;
      ActiveOne=(LinearLayout)v;
      button.setVisibility(View.VISIBLE);
     }
     break;
...e va fatto sparire il bottone quando si seleziona lo sfondo:
  mainLayout.setOnTouchListener(new View.OnTouchListener() {
   
   @Override
   public boolean onTouch(View v, MotionEvent event) {
    mlX=(int)event.getX();
    mlY=(int)event.getY();
    scrollView.requestDisallowInterceptTouchEvent(false);
    ActiveOne=null;
    button.setVisibility(View.INVISIBLE);
    return false;
   }
  });
Aggiungo un codice per il button che cancelli il Layout identificato da ActiveOne:
  button.setOnClickListener(new View.OnClickListener() {
   
   @Override
   public void onClick(View v) {
    TextView et=(TextView)ActiveOne.getChildAt(numEtichetta);
    TextView ct=(TextView)ActiveOne.getChildAt(numCategoria);
    Log.d(et.getText().toString(), ct.getText().toString());
    helper.cancella(et.getText().toString(), ct.getText().toString());
    ActiveOne=null;
    mainLayout.removeAllViews();
    try{
     leggiDaDatabase(currentCat);
    } catch(Exception e){} 
    button.setVisibility(View.INVISIBLE);
    
   }
  });
E funziona!

Ho aggiunto anche un'autocancellazione del button, che a questo punto non serve. Per riattivarlo bisognerà cliccare su un altro Layout.

Il button viene reso invisibile anche qualora si uscisse dalla modalità settingMode, vi ho aggiunto il codice necessario, perché se è stato selezionato un Layout in modalità settingMode e si tornasse alla modalità operativa immediatamente il bottone resterebbe indebitamente visibile, rischiandosi di cancellare involontariamente un Layout.
Il codice è stato aggiunto al listener screwOpen, quello che governa lo "svitamento" delle viti:
  screwOpen = new View.OnLongClickListener() {
   
   @Override
   public boolean onLongClick(View v) {
     Vibrator vib = (Vibrator) getApplicationContext().getSystemService(Context.VIBRATOR_SERVICE);
     // Vibrate for 500 milliseconds
     vib.vibrate(500); 
    if(v==leftTop && openFlag==0) {
     openFlag=1;
     if(settingMode==false) leftTop.setImageResource(R.drawable.unscrewed);
     else leftTop.setImageResource(R.drawable.screwed);
     
    }
    if(v==rightTop && openFlag==1) {
     openFlag=2; 
     if(settingMode==false) rightTop.setImageResource(R.drawable.unscrewed);
     else rightTop.setImageResource(R.drawable.screwed);
    }
    if(v==leftBottom && openFlag==2){
     openFlag=3;
     if(settingMode==false) leftBottom.setImageResource(R.drawable.unscrewed);
     else leftBottom.setImageResource(R.drawable.screwed);
    }
    if(v==rightBottom && openFlag==3) {
     if(settingMode==false){
      rightBottom.setImageResource(R.drawable.unscrewed);
      settingMode=true;
      
     } else
     {
      rightBottom.setImageResource(R.drawable.screwed);
      settingMode=false; 
      button.setVisibility(View.INVISIBLE);
     }

     openFlag=0;
    }
    return false;
   }
  };