Có cách nào để xác định xem listview đang được cuộn lên hoặc xuống không?Làm thế nào để phát hiện xem một listview đang cuộn lên hoặc xuống trong android?
OnScrollListener không giúp tôi trong trường hợp này.
Cảm ơn trước!
Có cách nào để xác định xem listview đang được cuộn lên hoặc xuống không?Làm thế nào để phát hiện xem một listview đang cuộn lên hoặc xuống trong android?
OnScrollListener không giúp tôi trong trường hợp này.
Cảm ơn trước!
đây là một thực hiện đơn giản:
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;
}
});
Chỉ hữu ích khi mục trên cùng không còn là mục đầu tiên nữa.Sẽ không cho bạn biết hướng nếu bạn di chuyển qua lại trong khi cùng một mục vẫn ở trên cùng. – AndroidDev
Có một phương pháp trong ScrollViews
báo cáo việc dịch chuyển cuộn. Nó được gọi là onScrollChanged()
. Tuy nhiên, nó được khai báo bảo vệ, vì vậy bạn phải tạo một lớp trình bao bọc để truy cập. Để sử dụng phương pháp, vui lòng kiểm tra tài liệu android.
Đầu tiên, tạo một giao diện để tiếp xúc với các phương pháp bảo vệ
public interface OnScrollListener {
void onScrollChanged(int x, int y, int oldx, int oldy);
}
Sau đó, tạo wrapper của bạn và mở rộng scrollview
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);
}
}
}
Cuối cùng, bao gồm nó trong bố trí XML của bạn giống như một giao diện tùy chỉnh, và đính kèm người nghe như bình thường.
<your.package.ReportingScrollView />
scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...});
Điều này dường như chỉ được gọi khi bạn thoát khỏi danh sách, nó không liên tục được gọi. –
Các giải pháp được đưa ra bởi một số Noob Student là tốt: bạn phải tạo một wrapper để sử dụng onScrollChanged bảo vệ (int x, int y, int oldx , int oldy) phương pháp, được kích hoạt thường xuyên hơn sau đó các tiêu chuẩn AbsListView.OnScrollListener.onScrollStateChanged (AbsListView xem, int scrollState).
Thật không may onScrollChanged() luôn trả về 0 dưới dạng tham số, bất kể tôi di chuyển như thế nào, và dường như chỉ phát hiện khi cuộn kết thúc, đến đầu hoặc cuối danh sách. Vì vậy, tôi đã sử dụng đoạn mã sau để phát hiện đúng hướng di chuyển: nó sử dụng getTop() của mục hiển thị đầu tiên nhưng cũng sử dụng vị trí của nó để hiểu khi nào mục đầu tiên không nhìn thấy được nữa; trong quá trình chuyển đổi mục này, hướng cuộn được đưa ra bởi chính vị trí mục đó.
@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;
}
}
}
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;
}
});
đây dựa trên các mục có thể nhìn thấy cuối cùng tôi quyết định xem danh sách được đi lên hoặc xuống
Một giải pháp dễ dàng và làm việc.
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;
}
hoạt động hoàn hảo, cảm ơn! – error1337
cho ai bao giờ vẫn đang tìm kiếm một câu trả lời cho Kotlin, điều này làm việc cho nó
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()
}
}
})
}
Bỏ ghi chú để sử dụng một phương pháp khác.
chính xác bạn muốn gì? u có thể giải thích thêm ... –
Tôi muốn tạo một số mã khi danh sách đang cuộn lên và tạo mã khác khi danh sách đang cuộn xuống. do đó, tôi muốn phát hiện nếu nó cuộn lên hoặc xuống – dor506
Xem http://stackoverflow.com/questions/6358428/implementation-of-onscrolllistener-to-detect-the-end-of-scrolling-in-a-listview này –