有沒有辦法檢測ListView是否快速滾動?也就是說,我們可以以某種方式知道用戶何時按下並釋放FastScroller?如何檢測ListView是否快速滾動
回答
嘗試使用setOnScrollListener並實現onScrollStateChanged。滾動狀態可以是空閒,觸摸滾動或一甩
setOnScrollListener(new OnScrollListener(){
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if(scrollState == 2) Log.i("a", "fast scroll");
}
});
}
反射允許你這樣做。通過查看AbsListView source code,有一個FastScroller
對象,它表示圍繞快速滾動功能的包裝。 Its source code顯示了一個有趣的field:
/**
* Current decoration state, one of:
* <ul>
* <li>{@link #STATE_NONE}, nothing visible
* <li>{@link #STATE_VISIBLE}, showing track and thumb
* <li>{@link #STATE_DRAGGING}, visible and showing preview
* </ul>
*/
private int mState;
該字段包含FastScroller
對象的狀態。解決方案包括通過反射讀取該字段的值,每次觸發onScroll()
和onScrollStateChanged()
方法。
此代碼實現上述解決方案:
private class CustomScrollListener implements OnScrollListener {
private ListView list;
private int mState = -1;
private Field stateField = null;
private Object mFastScroller;
private int STATE_DRAGGING;
public CustomScrollListener() {
super();
String fastScrollFieldName = "mFastScroller";
// this has changed on Lollipop
if (Build.VERSION.SDK_INT >= 21) {
fastScrollFieldName = "mFastScroll";
}
try {
Field fastScrollerField = AbsListView.class.getDeclaredField(fastScrollFieldName);
fastScrollerField.setAccessible(true);
mFastScroller = fastScrollerField.get(list);
Field stateDraggingField = mFastScroller.getClass().getDeclaredField("STATE_DRAGGING");
stateDraggingField.setAccessible(true);
STATE_DRAGGING = stateDraggingField.getInt(mFastScroller);
stateField = mFastScroller.getClass().getDeclaredField("mState");
stateField.setAccessible(true);
mState = stateField.getInt(mFastScroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// update fast scroll state
try {
if (stateField != null) {
mState = stateField.getInt(mFastScroller);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (mState == STATE_DRAGGING)) {
// the user is fast scrolling through the list
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// update fast scroll state
try {
if (stateField != null) {
mState = stateField.getInt(mFastScroller);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
fastScrollerField.get(grid)中的字段「grid」是什麼?使用它也有任何缺點,我假設反射使這'緩慢' – toidiu
'grid'是我使用的GridView。我正在將其更改爲「清單」,以便更清楚。 – Sebastiano
另外假設如果源從sdk更改爲sdk,這可能會中斷?並因此嘗試捕捉。看起來像一個hacky解決方案 – toidiu
- 1. 如何檢測Android ListView滾動停止?
- 2. 檢測UIScrollView是否滾動
- 3. Android的listview搜索和快速滾動
- 4. ListView控件崩潰時快速滾動
- 5. ListView快速滾動條錯誤
- 6. 如何檢測滾動框(html元素)是否可滾動
- 7. 如何快速檢測字符串是否被zlib壓縮?
- 8. 檢測是否啓用了HTC「快速啓動」
- 9. 加速listview滾動
- 10. Listview慢速滾動
- 11. 用於快速滾動長列表的Android ListView alpha滾動條
- 12. 如何覆蓋了Android的ListView快速滾動外觀
- 13. 如何實現快速滾動和albhabet索引器的ListView
- 14. UIWebView快速滾動
- 15. 如何獲得ListView的滾動速度?
- 16. 檢測WPF FrameworkElement是否在滾動
- 17. 如何檢測快速點擊對象?
- 18. 如何加快滾動條的速度
- 19. SectionIndexer如何影響Android快速滾動?
- 20. 如何做cardviews的快速滾動
- 21. 檢測時的ListView滾動到下
- 22. 檢測的ListView安卓向下滾動
- 23. 檢測WPF listview滾動條在底部?
- 24. 檢測快速用戶活動
- 25. opencv中的快速運動檢測
- 26. Android - Samsung問題 - ListView快速滾動雙擊拖動
- 27. 如何檢查網頁是否滾動?
- 28. 如何檢查ScrollView是否可滾動
- 29. 如何快速測試TypeMirror是否是另一個子類型
- 30. 不連續滾動 - 檢測用戶是否停止滾動
這並不意味着它的快速壽。即使用戶以很小的加速度閃爍,這也會觸發滾動。 –
你想確定它滾動的速度有多快? –
我試過已經和滾動觸摸屏幕或滾動fastScroller返回相同的scrollState。我正在使用帶有SLIDE_IN效果的JazzyListView,並且在ListView中啓用了快速滾動功能。當我快速滾動時,它不能正常工作,因爲第一個或最後一個可見項目多次不可見。我想在進入快速滾動模式時禁用該效果,並在離開時重新啓用它。 – mollymay