2010-12-07 27 views
47

Herkes, bir sütunda Metin Görünümlerini gösteren bir ListActivity örneğinin basit bir örneğine sahip mi ve soldan sağa kaydırdığınızda, bu satırı yeni bir görünümde görüyor musunuz? Bu, söz konusu satırdaki verileri düzenlemek veya bu satırda daha ayrıntılı bilgi göstermek olabilir. Ben googled ve bu cevap görmedim görmedim kod shogun veya diğer sitelere başvurmayın.Android Listede Hızlıca kaydırma

+0

ve diğer etkinlikler için bir longpress içindir. Kullanıcının, hangi satır üzerinde sürdüğü için tam veri ekranını açmak için soldan sağa kaydırmasını istiyorum. – JPM

+0

Parçaların şimdi bu sorunu çözdüğünü tahmin ediyorum. – JPM

cevap

115

Aynı problem vardı ve cevabımı burada bulamadım.

ListView öğesinde bir kaydırma işlemini algılamak ve kaydırılmış olarak işaretlemek istedim, ancak OnItemClick ve OnItemLongClick'i desteklemeye devam edin.

1 SwipeDetector sınıfı: Ben liste görünümünde tokatlamak dedektör sınıfını kullanın 2

import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 

public class SwipeDetector implements View.OnTouchListener { 

    public static enum Action { 
     LR, // Left to Right 
     RL, // Right to Left 
     TB, // Top to bottom 
     BT, // Bottom to Top 
     None // when no action was detected 
    } 

    private static final String logTag = "SwipeDetector"; 
    private static final int MIN_DISTANCE = 100; 
    private float downX, downY, upX, upY; 
    private Action mSwipeDetected = Action.None; 

    public boolean swipeDetected() { 
     return mSwipeDetected != Action.None; 
    } 

    public Action getAction() { 
     return mSwipeDetected; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      downX = event.getX(); 
      downY = event.getY(); 
      mSwipeDetected = Action.None; 
      return false; // allow other events like Click to be processed 
     case MotionEvent.ACTION_UP: 
      upX = event.getX(); 
      upY = event.getY(); 

      float deltaX = downX - upX; 
      float deltaY = downY - upY; 

      // horizontal swipe detection 
      if (Math.abs(deltaX) > MIN_DISTANCE) { 
       // left or right 
       if (deltaX < 0) { 
        Log.i(logTag, "Swipe Left to Right"); 
        mSwipeDetected = Action.LR; 
        return false; 
       } 
       if (deltaX > 0) { 
        Log.i(logTag, "Swipe Right to Left"); 
        mSwipeDetected = Action.RL; 
        return false; 
       } 
      } else if (Math.abs(deltaY) > MIN_DISTANCE) { // vertical swipe 
                  // detection 
       // top or down 
       if (deltaY < 0) { 
        Log.i(logTag, "Swipe Top to Bottom"); 
        mSwipeDetected = Action.TB; 
        return false; 
       } 
       if (deltaY > 0) { 
        Log.i(logTag, "Swipe Bottom to Top"); 
        mSwipeDetected = Action.BT; 
        return false; 
       } 
      } 
      return false; 
     } 
     return false; 
    } 
} 

:

final ListView lv = getListView(); 
    final SwipeDetector swipeDetector = new SwipeDetector(); 
    lv.setOnTouchListener(swipeDetector); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       if (swipeDetector.swipeDetected()){ 
        // do the onSwipe action 
       } else { 
        // do the onItemClick action 
       } 
      } 
    }); 
    lv.setOnItemLongClickListener(new OnItemLongClickListener() { 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) { 
      if (swipeDetector.swipeDetected()){ 
       // do the onSwipe action 
      } else { 
       // do the onItemLongClick action 
      } 
     } 
    }); 

Bu şekilde ben 3 destekleyebilir İşte

bana çözümdür eylemler - hızlıca kaydır, tıkla, uzun tıklama ve ListView öğesi bilgilerini kullanabilirim.

SONRA EKLENDİ: ListView yana

bir kaydırma hareketi yakalar, bazen zor çalmak. isSwipe bayrağını kullanarak

İşte
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: { 
      downX = event.getX(); 
      downY = event.getY(); 
      mSwipeDetected = Action.None; 
      return false; // allow other events like Click to be processed 
     } 
     case MotionEvent.ACTION_MOVE: { 
      upX = event.getX(); 
      upY = event.getY(); 

      float deltaX = downX - upX; 
      float deltaY = downY - upY; 

      // horizontal swipe detection 
      if (Math.abs(deltaX) > HORIZONTAL_MIN_DISTANCE) { 
       // left or right 
       if (deltaX < 0) { 
        Log.i(logTag, "Swipe Left to Right"); 
        mSwipeDetected = Action.LR; 
        return true; 
       } 
       if (deltaX > 0) { 
        Log.i(logTag, "Swipe Right to Left"); 
        mSwipeDetected = Action.RL; 
        return true; 
       } 
      } else 

      // vertical swipe detection 
      if (Math.abs(deltaY) > VERTICAL_MIN_DISTANCE) { 
       // top or down 
       if (deltaY < 0) { 
        Log.i(logTag, "Swipe Top to Bottom"); 
        mSwipeDetected = Action.TB; 
        return false; 
       } 
       if (deltaY > 0) { 
        Log.i(logTag, "Swipe Bottom to Top"); 
        mSwipeDetected = Action.BT; 
        return false; 
       } 
      } 
      return true; 
     } 
    } 
    return false; 
} 
+0

Neden böyle olsaydınız, Click gibi başka gerçek olayları geri döndürmezdiniz? – prometheuspk

+0

@Pinhassi, HORIZONTAL_MIN_DISTANCE ve VERTICAL_MIN_DISTANCE – AndroidDev

+1

HORIZONTAL_MIN_DISTANCE ve VERTICAL_MIN_DISTANCE değerlerinin ne olacağı, kullanıcının parmağının hareket etmesi gereken minimum mesafelerdir, böylece eylem bir tokatlamak olarak değerlendirilir. Bunu şu şekilde ayarladım: HORIZONTAL_MIN_DISTANCE = 40; VERTICAL_MIN_DISTANCE = 80; –

1

Burada, parmak uçlarını algılamak için kullandığım bir parçacık var. Görünümü değiştirmek için viewflipper kullanabilirsiniz.

@Override 
     public boolean onTouchEvent(MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } else { 
       return false; 
      } 
     } 

     private static final int SWIPE_MIN_DISTANCE = 30; 
     private static final int SWIPE_MAX_OFF_PATH = 250; 
     private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
     class MyGestureDetector extends SimpleOnGestureListener { 
      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
        float velocityY) { 
       try { 
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) 
         return false; 
        // right to left swipe 
        if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
          && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
         leftFling(); 
        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
          && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
         rightFling(); 
        } 
       } catch (Exception e) { 
        // nothing 
       } 
       return false; 
      } 

     } 
+0

Hazırlık örneği için daha fazlasını bekliyordum.Viewflippers'ı denedim, ancak bunu yaptığınızda liste boyutuyla her zaman garip bir şey. Kodunu çok hoş olsa da seviyorum. Gelecekteki denemelerimde kullanmam gerekecek, teşekkürler – JPM

1

(madde tıklamaları tespit etmek için onTouch tokatlamak tespiti için, ve onClickIem) iki dinleyici kullanarak çok basitleştirilmiş bir versiyonudur : düzeltmek için, ben SwipeDetector.onTouch aşağıdaki değişiklik yaptık onun isimli öncelikle bir kaydırma değildir dikkate alarak tıklama
algılama tokatlamak

olmadığını teyit kadar onClickItemListener durdurmak

 listView.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) 
      { 
       if(!isSwipe) 
       { 
        adapter.increase(arg2); 
        adapter.notifyDataSetChanged(); 
       } 
      } 
     }); 
Bir liste öğesi tokatlamak bu davranışa sahip internette kütüphanelerin bir sürü vardır olduğunda eylemlerle biraz düğmeleri görüntülemek istiyorsanız

Swipe

 listView.setOnTouchListener(new OnTouchListener() { 
     private int action_down_x = 0; 
      private int action_up_x = 0; 
      private int difference = 0; 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         action_down_x = (int) event.getX(); 
         isSwipe=false; //until now 
         break; 
        case MotionEvent.ACTION_MOVE: 
         if(!isSwipe) 
         { 
          action_up_x = (int) event.getX(); 
          difference = action_down_x - action_up_x; 
          if(Math.abs(difference)>50) 
          { 
           Log.d("action","action down x: "+action_down_x); 
           Log.d("action","action up x: "+action_up_x); 
           Log.d("action","difference: "+difference); 
           //swipe left or right 
           if(difference>0){ 
            //swipe left 
            Log.d("action","swipe left"); 
            adapter.decrease(selectedItem); 
            adapter.notifyDataSetChanged(); 
           } 
           else{ 
            //swipe right 
            Log.d("action","swipe right"); 
           } 
           isSwipe=true; 
          } 
         } 
         break; 
        case MotionEvent.ACTION_UP: 
         Log.d("action", "ACTION_UP - "); 
         action_down_x = 0; 
         action_up_x = 0; 
         difference = 0; 
         break; 
       } 
       return false; //to allow the clicklistener to work after 
      } 
     }) 
0

algılama. İnternette bulduğum kütüphaneyi uyguladım ve çok memnunum. Kullanımı çok kolay ve çok hızlı. Orijinal kitaplığı geliştirdim ve madde tıklaması için yeni bir tıklama dinleyici ekledim. Ayrıca harika bir kütüphane (http://fortawesome.github.io/Font-Awesome/) ekledim ve şimdi yeni bir öğe başlığı ekleyebilir ve yazı tipi isminden harika bir ikon adı belirtebilirsiniz.

Here github Zaten yazı tipi boyutlarını değiştirmek için contextmenu kullanıyorum bağlantı

İlgili konular