2012-03-09 16 views
7

Liste görünümünün yukarı veya aşağı kaydırılıp kaybolacağını belirlemek için bir yol var mı?Android'de bir liste görünümünün yukarı veya aşağı kayması nasıl algılanır?

OnScrollListener bu durumda bana yardımcı olmaz.

Şimdiden teşekkürler!

+0

tam olarak ne istiyorsunuz? daha fazla açıklayabiliyorsunuz ... –

+0

Liste ilerlerken bir miktar kod yapmak istiyorum ve liste aşağıya doğru kaydırırken diğer kodları yapmak istiyorum. Bu nedenle, yukarı veya aşağı kaydırıyor olup olmadığını bulmak istiyorum – dor506

+3

Bu http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview adresine bakın. –

cevap

12

bu basit bir uygulamasıdır:

lv.setOnScrollListener(new OnScrollListener() { 
     private int mLastFirstVisibleItem; 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 

      if(mLastFirstVisibleItem<firstVisibleItem) 
      { 
       Log.i("SCROLLING DOWN","TRUE"); 
      } 
      if(mLastFirstVisibleItem>firstVisibleItem) 
      { 
       Log.i("SCROLLING UP","TRUE"); 
      } 
      mLastFirstVisibleItem=firstVisibleItem; 

     } 
    }); 
+2

Sadece en üstteki öğe artık ilk öğe olmadığında faydalıdır.Aynı öğe üstte kalırken ileri geri kaydırırsanız size yön göstermez. – AndroidDev

4

Kaydırmaların kaydırılmasını bildiren ScrollViews numaralı bir yöntem var. Bu onScrollChanged() denir. Ancak, korumalı olarak bildirildiğinden, erişim kazanmak için bir sarmalayıcı sınıf oluşturmalısınız. Yöntemin kullanımı için lütfen android dokümanlar kontrol edin.

Birincisi,

public class ReportingScrollView extends ScrollView { 
private OnScrollListener onScrollListener = null; 

public ReportingScrollView(Context context) { 
    super(context); 
} 

public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public ReportingScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public void setOnScrollListener(OnScrollListener onScrollListener) { 
    this.onScrollListener = onScrollListener; 
} 

@Override 
protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
    super.onScrollChanged(x, y, oldx, oldy); 
    if (onScrollListener != null) { 
     onScrollListener.onScrollChanged(x, y, oldx, oldy); 
    } 
} 
} 

Son olarak scrollview Sonra korumalı yöntem

public interface OnScrollListener { 
void onScrollChanged(int x, int y, int oldx, int oldy); 
} 
maruz sizin sarıcı oluşturmak ve genişletmek için bir arayüz oluşturmak, özel bir görünüm gibi XML düzeni dahil, ve dinleyicileri her zamanki gibi ekleyin.

<your.package.ReportingScrollView /> 

scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...}); 
+2

Bu sadece listeye girdiğinizde çağrılır, tekrar tekrar denir. –

0

Bazı Noob Öğrenci tarafından verilen çözüm iyidir: Eğer korumalı onScrollChanged (int x, int y, int oldx kullanmak için bir sarmalayıcı oluşturmak zorunda daha sonra tetiklenir, daha sonra standart AbsListView.OnScrollListener.onScrollStateChanged (AbsListView görünümü, int scrollState).

Ne yazık ki onScrollChanged() işlevi, her ne kadar kaydırma yaptığım önemli değil, parametre olarak her zaman 0 değerini döndürür ve yalnızca kaydırma bittiğinde, listenin başına veya altına ulaşıldığında algılanır.

Kaydırmanın doğru yönünü saptamak için şu kodu kullandım: ilk görünen öğenin getTop() öğesini kullanır, ancak ilk öğenin artık görünmediğini anlamak için konumunu da kullanır; Bu öğe geçişi sırasında, kaydırma yönü, öğenin konumu tarafından verilir. Liste aşağı

0
list.setOnScrollListener(new OnScrollListener() { 
     int last_item; 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, 
       int visibleItemCount, int totalItemCount) { 
      if(last_item<firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling upwards"); 
      } 
      else if(last_item>firstVisibleItem+visibleItemCount-1){ 
       System.out.println("List is scrolling downwards"); 
      } 
      last_item = firstVisibleItem+visibleItemCount-1; 
     } 
    }); 

. kimin için hiç hareketsiz KOTLIN için bir yanıt arıyor

private int lastPosition = -1; 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
     { 
      if(lastPosition == firstVisibleItem) 
      { 
       return; 
      } 

      if(firstVisibleItem > lastPosition) 
      { 
       Logger.print("Going Down"); 
      } 
      else 
      { 
       Logger.print("Going Up"); 
      } 

      lastPosition = firstVisibleItem; 
     } 
1

kolay ve çalışma çözüm alacağız, olup olmadığını ben karar son görünür öğe temel alınarak Burada

 @Override 
     public void onScrollChanged(int x, int y, int oldx, int oldy) { 

      if(listView.getChildAt(0) != null) { 
       int scrollingDir = NO_SCROLLING; 
       int firstChildTop = listView.getChildAt(0).getTop(); 

       if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) { 
        if (mLastFirstChildTop < firstChildTop) { 
         //Scrolling DOWN 
         scrollingDir = SCROLLING_DOWN; 
        } else if (mLastFirstChildTop > firstChildTop) { 
         //Scrolling UP 
         scrollingDir = SCROLLING_UP; 
        } 
       } else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) { 
        //Scrolling UP 
        scrollingDir = SCROLLING_UP; 
       } else { 
        //Scrolling DOWN 
        scrollingDir = SCROLLING_DOWN; 
       } 
       mLastFirstVisiblePosition = listView.getFirstVisiblePosition(); 
       mLastFirstChildTop = firstChildTop; 

       switch(scrollingDir) { 
        case SCROLLING_DOWN: 
         //Your DOWN scrolling code here 
         break; 

        case SCROLLING_UP: 
         //Your UP scrolling code here 
         break; 

        default: 
        case NO_SCROLLING: 
         break; 
       } 
      } 
     } 
+1

mükemmel çalıştı, teşekkürler! – error1337

1

o

MainListView.setOnScrollListener(object :AbsListView.OnScrollListener { 
    // var VisibleItem: Int = 0 
     override fun onScroll(p0: AbsListView?, FirstVisibleItem: Int, i2: Int, i3: Int) { 
     /* 
     if(VisibleItem < FirstVisibleItem) 
     { 
     Toast.makeText(applicationContext,"Scrolling Down",Toast.LENGTH_SHORT).show() 
      fab.hide() 
     } 
     if(VisibleItem >FirstVisibleItem) 
     { 
      fab.show() 
      Toast.makeText(applicationContext,"Scrolling Up",Toast.LENGTH_SHORT).show() 
     } 
      VisibleItem=FirstVisibleItem; 
    */ 
     } 
     override fun onScrollStateChanged(p0: AbsListView?, p1: Int) { 
      if (p1 == 1) { 
       fab.hide() 
      } else { 
       fab.show() 
      } 
     } 

    }) 
} 

Uncomment alternatif bir yöntem kullanmak için, bu çalışır.

İlgili konular