2012-10-03 10 views
6

Espansione su un'altra domanda StackOverflow, ho implementato un codice di rilevamento dei gesti in modo da poter rilevare quando una riga nel mio listview (che è in un FrameLayout) è stata strisciata. Ho seguito la domanda/risposta di Damian su come ottenere la singola riga/vista dall'adattatore.Visualizzazione di un pulsante di eliminazione sullo scorrimento in un listview per Android

Ho codice nel mio onFling che ottiene la visualizzazione per la riga e tenta di rendere visibile un pulsante di eliminazione che è impostato come invisibile nel mio layout xml. Tuttavia, questo non succede. Mi stavo chiedendo come faccio a rendere visibile un pulsante in una listview in un colpo?

class MyGestureDetector extends SimpleOnGestureListener { 
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     try { 

      if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       int itemId = MyClass.this.lv.pointToPosition(
         (int) e1.getX(), (int) e1.getY()); 

       Log.v("item id", String.valueOf(itemId)); 
       View v = MyClass.this.adapter 
         .getViewOnScreen(itemId); 
       Button delete = (Button) v.findViewById(R.id.button_delete); 

       delete.setVisibility(View.VISIBLE); 
       //MyClass.this.adapter.notifyDataSetChanged(); 


      } 

     } catch (Exception e) { 
      // nothing 
     } 
     return false; 
    } 
} 

Il mio codice adattatore è lo stesso della domanda di riferimento.

Modifica: ho provato a utilizzare getChildAt() in listview per ottenere la vista della riga, e funziona quando c'è uno schermo o meno di elementi, ma quando c'è più della vista sbagliata viene restituito e quindi il pulsante di cancellazione sbagliato diventa visibile

Edit 2: ho usato la risposta sulla questione here per farlo funzionare:

risposta

9

ho implementato qualcosa di simile nella mia app una volta. Il modo in cui ho fatto:

public class MyGestureDetector extends SimpleOnGestureListener { 
    private ListView list; 

    public MyGestureDetector(ListView list) { 
     this.list = list; 
    } 

    //CONDITIONS ARE TYPICALLY VELOCITY OR DISTANCE  
    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if (INSERT_CONDITIONS_HERE) 
      if (showDeleteButton(e1)) 
       return true; 
     return super.onFling(e1, e2, velocityX, velocityY); 
    } 

    private boolean showDeleteButton(MotionEvent e1) { 
     int pos = list.pointToPosition((int)e1.getX(), (int)e1.getY()); 
     return showDeleteButton(pos); 
    } 

    private boolean showDeleteButton(int pos) { 
     View child = list.getChildAt(pos); 
     if (child != null){ 
      Button delete = (Button) child.findViewById(R.id.delete_button_id); 
      if (delete != null) 
       if (delete.getVisibility() == View.INVISIBLE) 
        delete.setVisibility(View.VISIBLE); 
       else 
        delete.setVisibility(View.INVISIBLE); 
      return true; 
     } 
     return false; 
    } 
} 

Questo ha funzionato per me, spero che si arriva a lavorare o che almeno si dà qualche suggerimento.

+0

Ciao usando lo stesso codice in frammento, ma iam ottenendo null in e1 nel metodo onFling. Potete per favore aiutarmi ? –

+1

@GangadharNimbalmente Probabilmente dovresti iniziare la tua domanda dove hai messo lo stacktrace completo e il tuo codice. – Heskja

+0

Ho implementato sopra la classe, ma alcuni come non funziona per me. new MyGestureDetector (lst_sampleList); –

Problemi correlati