2012-06-23 8 views
16

ListViewにスクロール可能なアイテムが十分にあるかどうかをどのように知っていますか?ListViewにスクロール可能なアイテム数があるかどうかを確認するにはどうすればいいですか?

たとえば、ListViewに5つのアイテムがある場合、すべてが1つの画面に表示されます。しかし、私は7以上を持っている場合、私のListViewはスクロールし始めます。私のリストがプログラムでスクロールできるかどうかはどうすれば分かりますか?

+0

なぜこれを知る必要がありますか?結局のところ、オリエンテーションの変更に応じて答えが変わるかもしれませんし、あなたの行にあるものに基づいて答えが変わるかもしれません(異なる行レイアウト、散文に基づく 'wrap_content'の高さの変更)。あなたは何を達成しようとしていますか? – CommonsWare

+0

5つの項目はhdpi 800x480ではスクロールできませんが、ldpiでスクロールすることがあります240x320、あなたのためのスクロールの世話をしてください!実際、コモンズウェアの考えは、私の心を通り抜けました。なぜ、あなたはこれをしたいのですか? – t0mm13b

+0

@CommonsWare、絶対に私はそれを理解しています。私は活動の最中にフッターを表示したい。 ListViewがスクロールする場合は、フッターイメージをListViewのフッタービューとして配置します。そうでなければ、アクティビティのレイアウトの終わりに配置された別のフッターの表示を設定できます。 –

答えて

-1

OnScrollListenerにコールバックを適用してsetOnScrollListenerを使用すると、あらかじめ定義された定数を使用してスクロールが行われているかどうかを判断し、状況に応じて処理できます。

+0

イベントが発生した場合にのみコールバックを受け取るでしょうか?しかし、ユーザーがリストをスクロールしようとする前にレイアウトを変更する必要があります。 –

1

これは、アンドロイドがlistViewでレンダリングする前に検出できません。ただし、このポストレンダリングは絶対に検出できます。これは何

boolean willMyListScroll() {   
    if(listView.getLastVisiblePosition() + 1 == listView.getCount()) { 
     return false; 
    } 

    return true;    
} 

listView可視ウィンドウは、すべてのリストビュー項目が含まれているかどうかをチェックします。可能であればlistViewは決してスクロールせず、getLastVisiblePosition()は常にリストのdataAdapter内の項目の合計数と同じになります。

+0

こんにちは、ありがとうございます。しかし、最後の項目が画面上で半分に見える場合、リストビューも同様にスクロールします。 –

+0

Diegosanの答えの "+1"部分を削除しますか? –

+1

いいえ、これは彼の答えを働かせることはありません。下の私の答えをチェックしてください。 –

13

最後の項目が部分的に画面に表示されている場合、Diegosanの答えで区別することはできません。この問題に対する解決策は次のとおりです。

まず、コンテンツがスクロール可能かどうかを確認する前に、ListViewを画面に表示する必要があります。これはViewTreeObserverで行うことができます。

ViewTreeObserver observer = listView.getViewTreeObserver(); 
    observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

     @Override 
     public void onGlobalLayout() { 
      if (willMyListScroll()) { 
       // Do something 
      } 
     } 
    }); 

そして、ここではwillMyListScroll()次のとおりです。

boolean willMyListScroll() { 
    int pos = listView.getLastVisiblePosition(); 
    if (listView.getChildAt(pos).getBottom() > listView.getHeight()) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+2

優れたソリューション - getChildAt(pos)のwillMyListScroll()メソッドにnullチェックを追加する必要があります。リストが空の場合、それはクラッシュします:D – HelloImKevo

+2

これは間違っていると思います。 getChildAt()は、画面に表示されている子のみをカウントします。一方、getLastVisiblePositionは、アダプタに基づいてインデックスを返します。したがって、lastVisiblePositionがリストの9番目の項目であり、画面に表示される項目が4つしかないためlastVisiblePositionが8の場合、クラッシュすることになります。 getChildCount()を呼び出して確認してください。 getChildAtのインデックスは、データセットのインデックスと同じではありません。 これをチェックしてください:http://stackoverflow.com/questions/6766625/listview-getchildat-returning-null-for-visible-children – jacosta

0

これは、私はそれが本当与えた場合、そのリストがである

if (listView.getAdapter() != null 
        && listView.getLastVisiblePosition() == listView.getAdapter().getCount() - 1 
        && listView.getChildAt(listView.getChildCount() - 1).getBottom() == listView.getBottom()) 

をチェックするために使用する方法です下の

3

マイクオルティスの答えによると、私は彼の答えが間違っていると信じています:

getChildAt()は、画面に表示されている子のみをカウントします。一方、getLastVisiblePositionは、アダプタに基づいてインデックスを返します。したがって、lastVisiblePositionがリストの9番目の項目であり、画面に表示される項目が4つしかないためlastVisiblePositionが8の場合、クラッシュすることになります。 getChildCount()を呼び出して確認してください。 getChildAtのインデックスは、データセットのインデックスと同じではありません。これをチェックアウト:ListView getChildAt returning null for visible children

をここに私のソリューションです:

public boolean isScrollable() { 
     int last = listView.getChildCount()-1; //last visible listitem view 
     if (listView.getChildAt(last).getBottom()>listView.getHeight() || listView.getChildAt(0).getTop()<0) { //either the first visible list item is cutoff or the last is cutoff 
       return true; 
     } 
     else{ 
      if (listView.getChildCount()==listView.getCount()) { //all visible listitem views are all the items there are (nowhere to scroll) 
       return false; 
      } 
      else{ //no listitem views are cut off but there are other listitem views to scroll to 
       return true; 
      } 
     } 
    } 
+0

このソリューションは、リスト上のあるポイントにスクロールしたり回転したりしても機能します電話。リスト – jacosta

-2
boolean listBiggerThanWindow = appHeight - 50 <= mListView.getHeight(); 

      Toast.makeText(HomeActivity.this, "list view bigger that window? " + listBiggerThanWindow, Toast.LENGTH_LONG) 
        .show(); 

      if (listBiggerThanWindow) { 
       // do your thing here... 
       } 

あなたはビューにポスト(Runnableを)を呼び出すことによってのonCreate内寸法は()を取得することができます。

+0

を最初に読み込んだ直後の呼び出しに限らず、appHeightとは何ですか?appHeightとは何ですか、その尺度は何ですか(px、dp、dipなど)。詳細を追加してください。 –

1

これは私がリストビューの最後の行の後に画像を表示するために書いたコードです:

public class ShowTheEndListview 
{ 
    private ImageView the_end_view; 
    private TabbedFragRootLayout main_layout; 
    private ListView listView; 
    private float pas; 
    private float the_end_img_height; 
    private int has_scroll = -1; 

    public ShowTheEndListview(float height) 
    { 
     the_end_img_height = height; 
     pas = 100/the_end_img_height; 
    } 

    public void setData(ImageView the_end_view, TabbedFragRootLayout main_layout, ListView listView) 
    { 
     this.the_end_view = the_end_view; 
     this.main_layout = main_layout; 
     this.listView = listView; 
    } 

    public void onScroll(int totalItemCount) 
    { 
     if(totalItemCount - 1 == listView.getLastVisiblePosition()) 
     { 
      int pos = totalItemCount - listView.getFirstVisiblePosition() - 1; 
      View last_item = listView.getChildAt(pos); 

      if (last_item != null) 
      { 
       if(listHasScroll(last_item)) 
       { 
//      Log.e(TAG, "listHasScroll TRUE"); 
       } 
       else 
       { 
//      Log.e(TAG, "listHasScroll FALSE"); 
       } 
      } 
     } 
    } 

    private boolean listHasScroll(View last_item) 
    { 
     if(-1 == has_scroll) 
     { 
      has_scroll = last_item.getBottom() > (main_layout.getBottom() - the_end_img_height - 5) ? 1 : 0; 
     } 

     return has_scroll == 1; 
    } 

    public void resetHasScroll() 
    { 
     has_scroll = -1; 
    } 
} 
1

AbsListViewがこれを含まれています:

/** 
* Check if the items in the list can be scrolled in a certain direction. 
* 
* @param direction Negative to check scrolling up, positive to check scrolling down. 
* @return true if the list can be scrolled in the specified direction, false otherwise. 
* @see #scrollListBy(int) 
*/ 
public boolean canScrollList(int direction); 

あなたはlayoutChildrenを(オーバーライドする必要があります)、それを使用その内で:

関連する問題