2012-03-09 9 views
7

listviewがスクロールアップまたはスクロールされているかどうかを確認する方法はありますか?リストビューがアンドロイドで上下にスクロールしているかどうかを検出する方法は?

この場合、OnScrollListenerは私を助けません。

ありがとうございます!

+0

あなたは何をしたいですか?より多くのことを説明することができます... –

+0

リストがスクロールアップしているときにコードを作って、リストがスクロールしているときに他のコードを作っています。したがって、それが上下にスクロールしているかどうかを検出したい場合は – dor506

+3

をご覧ください。http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview –

答えて

12

これは単純な実装です:

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

一番上の項目が最初の項目でなくなったときにのみ便利です。同じアイテムが上部に残っているときに前後にスクロールすると、方向を教えません。 – AndroidDev

4

ScrollViewsには、スクロールの移動を報告する方法があります。それはonScrollChanged()と呼ばれます。ただし、protectedと宣言されているため、アクセスを得るためにラッパークラスを作成する必要があります。このメソッドの使い方については、アンドロイドのドキュメントをチェックしてください。

まず、

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

最後にScrollViewを、そして、保護された方法

public interface OnScrollListener { 
void onScrollChanged(int x, int y, int oldx, int oldy); 
} 
を公開し、あなたのラッパーを作成し、拡張するためのインタフェースを作成し、カスタムビューのようなあなたのXMLレイアウトに含めると、いつものようにリスナーを付けてください。

<your.package.ReportingScrollView /> 

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

これはリストを飛ばしたときだけ呼び出されるようですが、繰り返し呼び出されることはありません。 –

0

一部Noobの学生によって与えられた解決策が良いです:あなたは、保護されたonScrollChanged(int型のx、int型のyを使用するためのラッパーを作成する必要があり、int型oldx 、int oldy)メソッドであり、標準のAbsListView.OnScrollListener.onScrollStateChanged(AbsListViewビュー、int scrollState)より頻繁にトリガーされます。

残念ながら、onScrollChanged()はどのようにスクロールしても常にパラメータとして0を返し、スクロールが終了してリストの上部または下部に達するときのみ検出するようです。

だからスクロールの右方向を検出するために、次のコードを使用する:それは最初の目に見えるアイテムのgetTop()を使用するだけでなく、最初の項目がもはや表示されたときに理解しないようにその位置を使用します。この項目の遷移中、項目の位置自体によってスクロールの方向が示されます。ここで

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

私はリストが簡単で作業溶液を上ったり

1

ダウンしているかどうかを決定し、最後に表示されるアイテムに基づきます。誰のために今までにまだkotlinのための答えを探して

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

完璧に働いた、ありがとう! – error1337

1

それは

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() 
      } 
     } 

    }) 
} 

コメントを外し、代替メソッドを使用するため、これは動作します。

関連する問題