2012-10-03 10 views
6

Po rozszerzeniu na inne pytanie dotyczące Stackoverflow, zaimplementowałem kod wykrywania gestów, dzięki czemu mogę wykryć, kiedy przesunięto wiersz w moim widoku listy (który znajduje się w FrameLayout). Podążyłem za pytaniem/odpowiedzią Damiana o tym, jak uzyskać pojedynczy wiersz/widok z adaptera. How to get location (on screen) of row in listviewWyświetlanie przycisku usuwania przy przesuwaniu w widoku listy dla Androida

Mam kod w moim onFling, który pobiera widok dla wiersza, i próbuje zrobić przycisk Usuń, który jest ustawiony jako niewidoczny w moim układzie xml na widoczne. Jednak tak się nie dzieje. Zastanawiam się, jak zrobić przycisk widoczny w widoku listy na przesunięcie?

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

Kod mojej listy jest taki sam, jak w zadaniu referencyjnym.

Edytuj: Próbowałem użyć getChildAt() w widoku listy, aby uzyskać widok wiersza, i to działa, gdy jest jeden ekran lub mniej elementów, ale gdy jest więcej niż błędny widok jest zwracany, a zatem nieprawidłowy przycisk usuwania staje się widoczny.

Edit 2: Kiedyś odpowiedź na pytanie here aby zmusić go do pracy:

Odpowiedz

9

I wdrożone coś takiego w moim app raz. Sposób, w jaki to zrobił:

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

ten pracował dla mnie, mam nadzieję, dostaniesz go do pracy lub że przynajmniej daje pewną wskazówkę.

+0

Witaj, używając tego samego kodu w fragmencie, ale w programie onFling otrzymuję wartość null na e1. Możesz mi pomóc ? –

+1

@GangadharNimbally Prawdopodobnie powinieneś rozpocząć własne pytanie, w którym umieszczasz kompletny stacktrace i twój kod. – Heskja

+0

Wdrożyłem powyższą klasę, ale niektóre jak to nie działa dla mnie. nowy MyGestureDetector (lst_sampleList); –

Powiązane problemy