我有一個ListView,首先向下滾動,現在當我們向上滾動時,它達到最高點。我想要檢測。是否有任何方法?我正在開發帶API級別的應用程序8.請求幫助..如何找出ListView是否已滾動到頂部大多數位置?
回答
編輯
見下面的評論,爲什麼,尤其是在不同版本的API(ESP後來者),這不是一個簡單的方法,如果你是列表的頂部(填充等)。但是,它確實爲您提供API 14以下設備解決方案的開始:就我多年前的實施而言 - 當時的工作非常完美。
您可以使用OnScrollListener來通知位置0現在可見。使用onScroll
方法。
lstView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//To change body of implemented methods use File | Settings | File Templates.
if (0 == firstVisibleItem){
Toast.makeText(MyActivity.this, "Scroll to Top ", Toast.LENGTH_SHORT).show();
}
}
});
提問者希望瞭解最頂點的時候,而不是當達到頂級項目時。如果在第一個項目上,但是不在最高點,這仍會觸發。 – wi1
你將需要檢查的是第一個可見的位置,然後將格雷姆的解決方案,看是否第一個可見的ListView項是在頂部位置。
喜歡的東西 lv.getFirstVisiblePosition()== 0 & &(lv.getChildCount()== 0 || lv.getChildAt(0).getTop()== 0)
我知道這個問題是舊的,但它顯示在谷歌搜索結果的頂部。有一個在API級別14引入了新的方法,讓我們需要什麼:
http://developer.android.com/reference/android/view/View.html#canScrollVertically%28int%29
對於舊平臺可以使用在V4支持庫的請參閱下面的編輯。ViewCompat
類似的靜態方法。
與Graeme的方法不同,此方法不受由內部視圖重用ListView
和/或標頭偏移引起的問題的影響。
編輯:最終的解決方案
我發現在SwipeRefreshLayout的源代碼處理這個方法。它可以被重寫爲:
public boolean canScrollUp(View view) {
if (android.os.Build.VERSION.SDK_INT < 14) {
if (view instanceof AbsListView) {
final AbsListView absListView = (AbsListView) view;
return absListView.getChildCount() > 0
&& (absListView.getFirstVisiblePosition() > 0 || absListView
.getChildAt(0).getTop() < absListView.getPaddingTop());
} else {
return view.getScrollY() > 0;
}
} else {
return ViewCompat.canScrollVertically(view, -1);
}
}
如果傳入視圖是自定義視圖,則可能需要添加自定義邏輯。
請注意,CanScrollVertically和canScrollHorizontally的ViewCompat方法總是在ICS下的平臺級別上返回false。該實現將這些方法設置爲返回false,除非被覆蓋,並且只有ICS的impl覆蓋方法。 – lillicoder
@lillicoder你說得對。我們不能在較老的平臺上使用這些實現。我編輯了答案,使其適用於所有平臺。 – topduo
Graeme的答案很接近但缺少user2036198添加的內容,對getFirstVisiblePosition()進行檢查。 getChildAt(0)不返回列表中第一個項目的第一個視圖。 AbsListView實現不會爲每個位置製作單個視圖,並將它們全部保存在內存中。相反,查看回收會生效,以限制任何時候實例化的視圖數量。
修復的方法是非常簡單的:
public boolean canScrollVertically(AbsListView view) {
boolean canScroll = false;
if (view != null && view.getChildCount() > 0) {
// First item can be partially visible, top must be 0 for the item
canScroll = view.getFirstVisiblePosition() != 0 || view.getChildAt(0).getTop() != 0;
}
return canScroll;
}
有關ICS或更高最好的結果,總是從V4支持庫或View.canScrollVertically()使用ViewCompat。在較低的API級別使用上述方法,因爲ViewCompat對於canSrollVertically()和canScrollHorizontally()在ICS下總是返回false。
如果您可以直接擴展ListView,那麼您可以在覆蓋方法「onScrollChanged()」內使用名爲「computeVerticalScrollOffset()」的受保護方法。
使用該受保護的方法返回0,意味着您的ListView現在已到達頂部。
代碼段
listView = new ListView(this){
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(computeVerticalScrollOffset() == 0){
// Reach top
}
}
這個問題是舊的,但我有一個完美的作品的解決方案,這是可能的,有人尋找一個解決方案工作。
int limitRowsBDshow = 10; //size limit your list
listViewMessages.setOnScrollListener(new AbsListView.OnScrollListener() {
int counter = 1;
int currentScrollState;
int currentFirstVisibleItem;
int currentVisibleItemCount;
int currentTotalItemCount;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.currentTotalItemCount = totalItemCount;
}
private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
/*** detect if there's been a scroll which has completed ***/
counter++;
if (currentFirstVisibleItem == 0 && currentTotalItemCount > limitRowsBDshow - 1) {
linearLay20msgMas.setVisibility(View.VISIBLE);
}
}
}
});
此代碼是前一次發現的(這裏是StackOverflow)。但我不能找到這個提
我的朋友們,結合格雷姆的回答與onScroll方法...
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem == 0 && listIsAtTop()){
swipeRefreshLayout.setEnabled(true);
}else{
swipeRefreshLayout.setEnabled(false);
}
}
});
private boolean listIsAtTop() {
if(listView.getChildCount() == 0) return true;
return listView.getChildAt(0).getTop() == 0;
}
豎起大拇指提及swipeRefreshLayout。特別是我需要的。 – ralphgabb
- 1. 找出UITableView是否滾動到頂部
- 2. 找出ListView是否滾動到上?
- 3. Android ListView滾動到頂部
- 4. 如何知道listview scroll是否已經到達底部/頂部
- 5. Listview自動滾動到頂部
- 6. Android ListView滾動到位置
- 7. 滾動ListViewItem在ListView頂部
- 8. Yii ListView分頁:滾動到頂部
- 9. 禁用ListView滾動到頂部
- 10. 防止ListView滾動到頂部on notifyDAtaSetChanged
- 11. Xamarin表單ListView滾動到頂部?
- 12. 大型ListView快速滾動時彈出頂部
- 13. 如何在ListView中滾動時將項目設置爲頂部?
- 14. UITextView在頂部的滾動位置
- 15. 增加頂部位置絕對滾動
- 16. 滾動頂部給定的位置
- 17. 如何將滾動條/視圖置於頂部位置?
- 18. jQuery從當前位置滾動到目標位置不是頂部
- 19. Android ListView滾動,觸摸後滾動到頂部
- 20. 如何將滾動條設置爲頂部/忘記滾動位置
- 21. 如何讓ListView始終滾動到頂部?
- 22. 如何滾動到ListView的頂部陣營本地
- 23. Listview - 如何從第10個項目平滑滾動到頂部?
- 24. 如何保存ListView的滾動位置
- 25. 給滾動條頂部位置(滾動頂部)不起作用的警報
- 26. RecyclerView - 跳轉到位置,然後平滑滾動到頂部
- 27. ListView獲取滾動位置?
- 28. 頂部溢出是不可滾動的
- 29. 如何找出頁面大小是否已達到春季jpa
- 30. android listview滾動過去頂部
很好...乾淨,簡單 – Houston
這並不總是返回0當我在列表的頂部 – JackMahoney
(您可以添加... getTop ()> 0 || ... getTop()
Graeme