2012-10-03 49 views
6

Ampliando otra pregunta de Stackoverflow, he implementado un código de detección de gestos para poder detectar cuándo se ha eliminado una fila en mi lista de lista (que está en FrameLayout). Seguí la pregunta/respuesta de Damian aquí sobre cómo obtener la fila/vista individual del adaptador. How to get location (on screen) of row in listviewMostrando un botón Eliminar al deslizar en una vista de lista para Android

que tienen código en mi onFling que obtiene la vista de la fila, y trata de hacer un botón de borrado que se establece como invisible en mi diseño xml a visible. Sin embargo, esto no sucede. Me preguntaba cómo puedo hacer que un botón sea visible en una vista de lista en un deslizamiento.

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; 
    } 
} 

Mi código de adaptador de lista es el mismo que el de la pregunta a la que se hace referencia.

Editar: Intenté usar getChildAt() en la vista de lista para obtener la vista de la fila, y esto funciona cuando hay una pantalla o menos elementos, pero cuando se devuelve más que la vista incorrecta y, por lo tanto, el botón eliminar incorrecto se vuelve visible

Edición 2: He utilizado la respuesta a la cuestión here a conseguir que funcione:

Respuesta

9

he implementado algo como esto en mi aplicación una vez. La forma en que lo hice:

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; 
    } 
} 

Esto funcionó para mí, espero que va a conseguir que funcione o que al menos le da alguna pista.

+0

Hola usando el mismo código en fragmento, pero iam obtiene nulo en e1 en el método onFling. Podrías ayudarme ? –

+1

@GangadharNimbally Probablemente deberías comenzar tu propia pregunta donde colocas la stacktrace completa y tu código. – Heskja

+0

Implementé la clase anterior, pero de alguna forma no funciona para mí. nuevo MyGestureDetector (lst_sampleList); –

Cuestiones relacionadas