Как вызвать событие, когда scrollView достигает нижней части Android?

Я ищу событие, которое я могу использовать в scrollView, чтобы его запускали, когда пользователь прокручивал его вниз.

Например, мой список предметов должен быть расширен с большим количеством элементов автоматически.

Любые идеи, как это можно сделать?

Я благодарен за любой совет.

Solutions Collecting From Web of "Как вызвать событие, когда scrollView достигает нижней части Android?"

Пожалуйста, прочитайте эту статью: Android: Понимание, когда Scrollview достигли нижней

Исходный код:

@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { // Grab the last child placed in the ScrollView, we need it to determinate the bottom position. View view = (View) getChildAt(getChildCount()-1); // Calculate the scrolldiff int diff = (view.getBottom()-(getHeight()+getScrollY())); // if diff is zero, then the bottom has been reached if( diff == 0 ) { // notify that we have reached the bottom Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached" ); } super.onScrollChanged(l, t, oldl, oldt); } 

Если вы хотите, вы можете добавить собственный виджет.

Пример:

 package se.marteinn.ui; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.ScrollView; /** * Triggers a event when scrolling reaches bottom. * * Created by martinsandstrom on 2010-05-12. * Updated by martinsandstrom on 2014-07-22. * * Usage: * * scrollView.setOnBottomReachedListener( * new InteractiveScrollView.OnBottomReachedListener() { * @Override * public void onBottomReached() { * // do something * } * } * ); * * * Include in layout: * * <se.marteinn.ui.InteractiveScrollView * android:layout_width="match_parent" * android:layout_height="match_parent" /> * */ public class InteractiveScrollView extends ScrollView { OnBottomReachedListener mListener; public InteractiveScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public InteractiveScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public InteractiveScrollView(Context context) { super(context); } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { View view = (View) getChildAt(getChildCount()-1); int diff = (view.getBottom()-(getHeight()+getScrollY())); if (diff == 0 && mListener != null) { mListener.onBottomReached(); } super.onScrollChanged(l, t, oldl, oldt); } // Getters & Setters public OnBottomReachedListener getOnBottomReachedListener() { return mListener; } public void setOnBottomReachedListener( OnBottomReachedListener onBottomReachedListener) { mListener = onBottomReachedListener; } /** * Event listener. */ public interface OnBottomReachedListener{ public void onBottomReached(); } } 

Учитывая требования, вы, вероятно, будете расширять BaseAdapter (в отличие от CursorAdapter, который использует другой механизм).

Вот фрагмент для этого:

 public View getView(int position, View convertView, ViewGroup parent) { if (position == backingLinkedList.size()) { //get more items and add them to the backingLinkedList in a background thread notifyDataSetChanged(); } } 

У меня была та же проблема, и я решил ее с помощью ListView (автоматически добавляет ScrollView, если это необходимо) и установки OnScrollListener .

Вот пример кода:

  tableListView.setOnScrollListener(new OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (visibleItemCount == totalItemCount) // too little items (ScrollView not needed) { java.lang.System.out.println("too little items to use a ScrollView!"); } else { if ((firstVisibleItem + visibleItemCount) == totalItemCount) { // put your stuff here java.lang.System.out.println("end of the line reached!"); } } } }); 

Это гораздо более простое решение без необходимости просмотра подпрограмм подкласса. Предполагая, что у вас есть переменная recyclerView RecyclerView,

RecyclerView.computeVerticalScrollRange () дает вам полный диапазон прокрутки, или, другими словами, высоту содержимого.

(RecyclerView.computeVerticalScrollOffset () дает смещение сверху при прокрутке. Это значение будет продолжаться до высоты содержимого – прокрутите высоту просмотра.

Так,

  if( (recyclerView.computeVerticalScrollOffset() == (recyclerView.computeVerticalScrollRange() - recyclerView.getHeight()) ) { // You have hit rock bottom. } 

Манипулирование детским представлением вида прокрутки просто кажется настолько взломанным.