Cari tahu apakah ListView digulir ke bawah?

105

Dapatkah saya mengetahui apakah ListView saya di-scroll ke bawah? Maksud saya, item terakhir terlihat sepenuhnya.

fhucho
sumber

Jawaban:

171

Diedit :

Karena saya telah menyelidiki subjek khusus ini di salah satu aplikasi saya, saya dapat menulis jawaban tambahan untuk pembaca selanjutnya dari pertanyaan ini.

Menerapkan OnScrollListener, mengatur Anda ListView's onScrollListenerdan kemudian Anda harus mampu menangani hal-hal dengan benar.

Sebagai contoh:

private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);

// ... ... ...

@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
        final int visibleItemCount, final int totalItemCount)
{

    switch(lw.getId()) 
    {
        case R.id.your_list_id:     

            // Make your calculation stuff here. You have all your
            // needed info from the parameters of this function.

            // Sample calculation to determine if the last 
            // item is fully visible.
            final int lastItem = firstVisibleItem + visibleItemCount;

            if(lastItem == totalItemCount)
            {
                if(preLast!=lastItem)
                {
                    //to avoid multiple calls for last item
                    Log.d("Last", "Last");
                    preLast = lastItem;
                }
            }
    }
}
Wroclai
sumber
26
Ini tidak akan mendeteksi apakah item terakhir terlihat sepenuhnya.
fhucho
1
Jika Anda memiliki header atau footer di listview Anda, Anda harus memperhitungkannya juga.
Martin Marconcini
5
@Wroclai Ini tidak akan mendeteksi apakah item terakhir terlihat sepenuhnya.
Gaurav Arora
Saya sedang mencari beberapa kode KERJA serupa .. Berhasil !! Terima kasih banyak!!
Suraj Dubey
Saya tidak ingin memulai pertanyaan baru, tapi apa yang saya lakukan jika saya listviewyaitu stackFromBottom? Saya mencoba if (0 == firstVisibleItem){//listviewtop}tetapi itu dipanggil berulang kali.
shadyinside
68

Jawaban terlambat, tetapi jika Anda hanya ingin memeriksa apakah ListView Anda di-scroll ke bawah atau tidak, tanpa membuat event listener, Anda dapat menggunakan pernyataan-if ini:

if (yourListView.getLastVisiblePosition() == yourListView.getAdapter().getCount() -1 &&
    yourListView.getChildAt(yourListView.getChildCount() - 1).getBottom() <= yourListView.getHeight())
{
    //It is scrolled all the way down here

}

Pertama, ia memeriksa apakah posisi terakhir yang mungkin terlihat. Kemudian ia memeriksa apakah bagian bawah tombol terakhir sejajar dengan bagian bawah ListView. Anda dapat melakukan sesuatu yang serupa untuk mengetahui apakah semuanya berjalan di atas:

if (yourListView.getFirstVisiblePosition() == 0 &&
    yourListView.getChildAt(0).getTop() >= 0)
{
    //It is scrolled all the way up here

}
Martijn
sumber
4
Terima kasih. Hanya perlu mengubah ... getChildAt (yourListView.getCount () -1) ... menjadi ... getChildAt (yourListView.getChildCount () -1) ...
OferR
@OferR Tidak yakin, tapi saya pikir getChildCount()mengembalikan tampilan di viewgroup, yang dengan tampilan daur ulang tidak sama dengan jumlah item di adaptor. Namun, karena ListView diturunkan dari AdapterView, Anda bisa menggunakan getCount()langsung di ListView.
William T. Mallard
@ William T. Mallard Kalimat pertama Anda benar, dan inilah yang kami inginkan: Tampilan terakhir ditampilkan dalam grup. Ini untuk memverifikasi bahwa itu terlihat sepenuhnya. (Pertimbangkan ListView dengan 20 baris, tetapi hanya 8 yang terakhir yang ditampilkan. Kami ingin mendapatkan Tampilan ke-8 di ViewGroup, bukan yang ke-20 yang tidak ada)
OferR
perhatikan bahwa solusi ini tidak akan berfungsi jika Anda memperbarui tampilan daftar dengan cepat.
tupai
19

Cara saya melakukannya:

listView.setOnScrollListener(new AbsListView.OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE 
            && (listView.getLastVisiblePosition() - listView.getHeaderViewsCount() -
            listView.getFooterViewsCount()) >= (adapter.getCount() - 1)) {

        // Now your listview has hit the bottom
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

    }
});
t-gao
sumber
1
Itu mengagumkan! Terima kasih
shariful islam
10

Sesuatu yang mempengaruhi:

if (getListView().getLastVisiblePosition() == (adapter.items.size() - 1))
Chris Stewart
sumber
1
Ini tidak akan mendeteksi apakah item terakhir terlihat sepenuhnya.
Duanniston Cardoso Cabral
6
public void onScrollStateChanged(AbsListView view, int scrollState)        
{
    if (!view.canScrollList(View.SCROLL_AXIS_VERTICAL) && scrollState == SCROLL_STATE_IDLE)    
    {
        //When List reaches bottom and the list isn't moving (is idle)
    }
}

Ini berhasil untuk saya.

Janwilx72
sumber
1
Sayangnya, metode view.canScrollList adalah API 19+
ozmank
Bekerja seperti pesona
pavaniiitn
4

Ini bisa jadi

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                // TODO Auto-generated method stub

                if (scrollState == 2)
                    flag = true;
                Log.i("Scroll State", "" + scrollState);
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // TODO Auto-generated method stub
                if ((visibleItemCount == (totalItemCount - firstVisibleItem))
                        && flag) {
                    flag = false;



                    Log.i("Scroll", "Ended");
                }
            }
tuan malas
sumber
3

Sangat menyakitkan untuk berurusan dengan pengguliran, mendeteksi ketika selesai dan memang ada di bagian bawah daftar (bukan bagian bawah layar yang terlihat), dan memicu layanan saya hanya sekali, untuk mengambil data dari web. Namun itu berfungsi dengan baik sekarang. Kode tersebut adalah sebagai berikut untuk kepentingan siapa saja yang menghadapi situasi yang sama.

CATATAN: Saya harus memindahkan kode terkait adaptor saya ke onViewCreated daripada onCreate dan mendeteksi pengguliran terutama seperti ini:

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}

public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (getListView().getLastVisiblePosition() == (adapter.getCount() - 1))
        if (RideListSimpleCursorAdapter.REACHED_THE_END) {
            Log.v(TAG, "Loading more data");
            RideListSimpleCursorAdapter.REACHED_THE_END = false;
            Intent intent = new Intent(getActivity().getApplicationContext(), FindRideService.class);
            getActivity().getApplicationContext().startService(intent);
        }
}

Di sini RideListSimpleCursorAdapter.REACHED_THE_END adalah variabel tambahan di SimpleCustomAdapter saya yang disetel seperti ini:

if (position == getCount() - 1) {
      REACHED_THE_END = true;
    } else {
      REACHED_THE_END = false;
    }

Hanya jika kedua ketentuan ini bertemu, itu berarti saya memang ada di paling bawah daftar, dan layanan saya hanya akan berjalan sekali. Jika saya tidak menangkap REACHED_THE_END, bahkan menggulir ke belakang akan memicu layanan lagi, selama item terakhir terlihat.

zeeshan
sumber
Saya menyingkirkan yang lain karena itu menyebabkan saya masalah tetapi secara keseluruhan jawaban yang bagus
Mike Baglio Jr.
3

canScrollVertically(int direction)berfungsi untuk semua Tampilan, dan tampaknya melakukan apa yang Anda minta, dengan kode lebih sedikit daripada kebanyakan jawaban lainnya. Masukkan angka positif, dan jika hasilnya salah, Anda berada di bawah.

yaitu:

if (!yourView.canScrollVertically(1)) { //you've reached bottom }

Joel H.
sumber
2

Untuk memperluas sedikit pada salah satu jawaban di atas, inilah yang harus saya lakukan untuk membuatnya berfungsi sepenuhnya. Tampaknya ada sekitar 6dp padding bawaan di dalam ListView, dan onScroll () dipanggil saat daftar kosong. Ini menangani kedua hal itu. Ini mungkin bisa sedikit dioptimalkan, tetapi ditulis lebih untuk kejelasan.

Catatan samping: Saya telah mencoba beberapa teknik konversi dp ke piksel yang berbeda, dan dp2px () ini adalah yang terbaik.

myListView.setOnScrollListener(new OnScrollListener() {
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if (visibleItemCount > 0) {
            boolean atStart = true;
            boolean atEnd = true;

            View firstView = view.getChildAt(0);
            if ((firstVisibleItem > 0) ||
                    ((firstVisibleItem == 0) && (firstView.getTop() < (dp2px(6) - 1)))) {
                // not at start
                atStart = false;
            }

            int lastVisibleItem = firstVisibleItem + visibleItemCount;
            View lastView = view.getChildAt(visibleItemCount - 1);
            if ((lastVisibleItem < totalItemCount) ||
                    ((lastVisibleItem == totalItemCount) &&
                            ((view.getHeight() - (dp2px(6) - 1)) < lastView.getBottom()))
                    ) {
                        // not at end
                    atEnd = false;
                }

            // now use atStart and atEnd to do whatever you need to do
            // ...
        }
    }
    public void onScrollStateChanged(AbsListView view, int scrollState) {
    }
});

private int dp2px(int dp) {
    return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
CSX321
sumber
2

Saya belum bisa berkomentar karena saya belum punya cukup reputasi, tapi dalam jawaban @Ali Imran dan @Wroclai saya rasa ada yang kurang. Dengan potongan kode itu, setelah Anda memperbarui preLast, itu tidak akan pernah menjalankan Log lagi. Dalam masalah khusus saya, saya ingin menjalankan beberapa operasi setiap kali saya menggulir ke bawah, tetapi setelah preLast diperbarui ke LastItem, operasi itu tidak pernah dijalankan lagi.

private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);

// ... ... ...

@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
                 final int visibleItemCount, final int totalItemCount) {

switch(lw.getId()) {
    case android.R.id.list:     

        // Make your calculation stuff here. You have all your
        // needed info from the parameters of this function.

        // Sample calculation to determine if the last 
        // item is fully visible.
         final int lastItem = firstVisibleItem + visibleItemCount;
       if(lastItem == totalItemCount) {
          if(preLast!=lastItem){ //to avoid multiple calls for last item
            Log.d("Last", "Last");
            preLast = lastItem;
          }
       } else {
            preLast = lastItem;
}

}

Dengan "lain" itu Anda sekarang dapat mengeksekusi kode Anda (Log, dalam hal ini) setiap kali Anda menggulir ke bawah sekali lagi.

Teno Gonzalez Dos Santos
sumber
2
public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {
        int lastindex = view.getLastVisiblePosition() + 1;

        if (lastindex == totalItemCount) { //showing last row
            if ((view.getChildAt(visibleItemCount - 1)).getTop() == view.getHeight()) {
                //Last row fully visible
            }
        }
    }
John Ruban Singh
sumber
1

Agar daftar Anda dipanggil ketika daftar mencapai terakhir dan jika terjadi kesalahan, maka ini tidak akan memanggil endoflistview lagi . Kode ini akan membantu skenario ini juga.

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {
    final int lastPosition = firstVisibleItem + visibleItemCount;
    if (lastPosition == totalItemCount) {
        if (previousLastPosition != lastPosition) { 

            //APPLY YOUR LOGIC HERE
        }
        previousLastPosition = lastPosition;
    }
    else if(lastPosition < previousLastPosition - LIST_UP_THRESHOLD_VALUE){
        resetLastIndex();
    }
}

public void resetLastIndex(){
    previousLastPosition = 0;
}

di mana LIST_UP_THRESHOLD_VALUE dapat berupa nilai bilangan bulat apa pun (saya telah menggunakan 5) di mana daftar Anda digulir ke atas dan saat kembali ke akhir, ini akan memanggil kembali tampilan daftar akhir.

Vyshnavi
sumber
1

Saya menemukan cara yang sangat bagus untuk secara otomatis memuat kumpulan halaman berikutnya dengan cara yang tidak memerlukan Anda sendiri ScrollView(seperti jawaban yang diterima mensyaratkan).

Di ParseQueryAdapter, ada metode yang disebut getNextPageViewyang memungkinkan Anda menyediakan tampilan kustom Anda sendiri yang muncul di akhir daftar ketika ada lebih banyak data untuk dimuat sehingga hanya akan terpicu ketika Anda telah mencapai akhir dari kumpulan halaman Anda saat ini (ini adalah tampilan "muat lebih banyak .." secara default). Metode ini hanya dipanggil jika ada lebih banyak data untuk dimuat, jadi ini adalah tempat yang tepat untuk menelepon. loadNextPage(); Dengan cara ini adaptor melakukan semua kerja keras untuk Anda dalam menentukan kapan data baru harus dimuat dan tidak akan dipanggil sama sekali jika Anda memilikinya mencapai akhir kumpulan data.

public class YourAdapter extends ParseQueryAdapter<ParseObject> {

..

@Override
public View getNextPageView(View v, ViewGroup parent) {
   loadNextPage();
   return super.getNextPageView(v, parent);
  }

}

Kemudian di dalam aktivitas / fragmen Anda, Anda hanya perlu menyetel adaptor dan data baru akan otomatis diperbarui untuk Anda seperti sulap.

adapter = new YourAdapter(getActivity().getApplicationContext());
adapter.setObjectsPerPage(15);
adapter.setPaginationEnabled(true);
yourList.setAdapter(adapter);
Max Worg
sumber
1

Untuk mendeteksi apakah item terakhir terlihat sepenuhnya , Anda dapat menambahkan kalkulasi sederhana pada tampilan item terakhir yang terlihat dengan lastItem.getBottom().

yourListView.setOnScrollListener(this);   

@Override
public void onScroll(AbsListView view, final int firstVisibleItem,
                 final int visibleItemCount, final int totalItemCount) {

    int vH = view.getHeight();
    int topPos = view.getChildAt(0).getTop();
    int bottomPos = view.getChildAt(visibleItemCount - 1).getBottom();

    switch(view.getId()) {
        case R.id.your_list_view_id:
            if(firstVisibleItem == 0 && topPos == 0) {
                //TODO things to do when the list view scroll to the top
            }

            if(firstVisibleItem + visibleItemCount == totalItemCount 
                && vH >= bottomPos) {
                //TODO things to do when the list view scroll to the bottom
            }
            break;
    }
}
Akan
sumber
1

Aku pergi dengan:

@Override
public void onScroll(AbsListView listView, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
    if(totalItemCount - 1 == favoriteContactsListView.getLastVisiblePosition())
    {
        int pos = totalItemCount - favoriteContactsListView.getFirstVisiblePosition() - 1;
        View last_item = favoriteContactsListView.getChildAt(pos);

        //do stuff
    }
}
Goran Horia Mihail
sumber
1

Dalam metode getView()(dari BaseAdapterkelas yang diturunkan) seseorang dapat memeriksa apakah posisi tampilan saat ini sama dengan daftar item di Adapter. Jika demikian, berarti kita telah mencapai akhir / terbawah daftar:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // ...

    // detect if the adapter (of the ListView/GridView) has reached the end
    if (position == getCount() - 1) {
        // ... end of list reached
    }
}
ramon
sumber
0

Saya menemukan cara yang lebih baik untuk mendeteksi scroll listview berakhir di bagian bawah, pertama-tama deteksi scoll end dengan
Implementasi onScrollListener ini untuk mendeteksi akhir dari scrolling di ListView

 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    this.currentFirstVisibleItem = firstVisibleItem;
    this.currentVisibleItemCount = visibleItemCount;
}

public void onScrollStateChanged(AbsListView view, int scrollState) {
    this.currentScrollState = scrollState;
    this.isScrollCompleted();
 }

private void isScrollCompleted() {
    if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
        /*** In this way I detect if there's been a scroll which has completed ***/
        /*** do the work! ***/
    }
}

akhirnya menggabungkan jawaban Martijn

OnScrollListener onScrollListener_listview = new OnScrollListener() {       

        private int currentScrollState;
        private int currentVisibleItemCount;

        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            // TODO Auto-generated method stub

            this.currentScrollState = scrollState;
            this.isScrollCompleted();
        }

        @Override
        public void onScroll(AbsListView lw, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            // TODO Auto-generated method stub
            this.currentVisibleItemCount = visibleItemCount;

        }

        private void isScrollCompleted() {
            if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
                /*** In this way I detect if there's been a scroll which has completed ***/
                /*** do the work! ***/

                if (listview.getLastVisiblePosition() == listview.getAdapter().getCount() - 1
                        && listview.getChildAt(listview.getChildCount() - 1).getBottom() <= listview.getHeight()) {
                    // It is scrolled all the way down here
                    Log.d("henrytest", "hit bottom");
                }


            }
        }

    };
HenryChuang
sumber
0

Terima kasih banyak untuk poster di stackoverflow! Saya menggabungkan beberapa ide dan membuat pendengar kelas untuk aktivitas dan fragmen (jadi kode ini lebih dapat digunakan kembali, membuat kode lebih cepat untuk ditulis dan lebih bersih).

Yang harus Anda lakukan ketika Anda mendapatkan kelas saya adalah mengimplementasikan antarmuka (dan tentu saja membuat metode untuk itu) yang dideklarasikan di kelas saya dan membuat objek dari kelas ini melewati argumen.

/**
* Listener for getting call when ListView gets scrolled to bottom
*/
public class ListViewScrolledToBottomListener implements AbsListView.OnScrollListener {

ListViewScrolledToBottomCallback scrolledToBottomCallback;

private int currentFirstVisibleItem;
private int currentVisibleItemCount;
private int totalItemCount;
private int currentScrollState;

public interface ListViewScrolledToBottomCallback {
    public void onScrolledToBottom();
}

public ListViewScrolledToBottomListener(Fragment fragment, ListView listView) {
    try {
        scrolledToBottomCallback = (ListViewScrolledToBottomCallback) fragment;
        listView.setOnScrollListener(this);
    } catch (ClassCastException e) {
        throw new ClassCastException(fragment.toString()
                + " must implement ListViewScrolledToBottomCallback");
    }
}

public ListViewScrolledToBottomListener(Activity activity, ListView listView) {
    try {
        scrolledToBottomCallback = (ListViewScrolledToBottomCallback) activity;
        listView.setOnScrollListener(this);
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement ListViewScrolledToBottomCallback");
    }
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    this.currentFirstVisibleItem = firstVisibleItem;
    this.currentVisibleItemCount = visibleItemCount;
    this.totalItemCount = totalItemCount;
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
    this.currentScrollState = scrollState;
    if (isScrollCompleted()) {
        if (isScrolledToBottom()) {
            scrolledToBottomCallback.onScrolledToBottom();
        }
    }
}

private boolean isScrollCompleted() {
    if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
        return true;
    } else {
        return false;
    }
}

private boolean isScrolledToBottom() {
    System.out.println("First:" + currentFirstVisibleItem);
    System.out.println("Current count:" + currentVisibleItemCount);
    System.out.println("Total count:" + totalItemCount);
    int lastItem = currentFirstVisibleItem + currentVisibleItemCount;
    if (lastItem == totalItemCount) {
        return true;
    } else {
        return false;
    }
}
}
Janusz Hain
sumber
0

Anda perlu menambahkan sumber daya footer xml kosong ke listView dan mendeteksi apakah footer ini terlihat.

    private View listViewFooter;
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_newsfeed, container, false);

        listView = (CardListView) rootView.findViewById(R.id.newsfeed_list);
        footer = inflater.inflate(R.layout.newsfeed_listview_footer, null);
        listView.addFooterView(footer);

        return rootView;
    }

Kemudian dalam pendengar gulir listView, Anda melakukan ini

@
Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  if (firstVisibleItem == 0) {
    mSwipyRefreshLayout.setDirection(SwipyRefreshLayoutDirection.TOP);
    mSwipyRefreshLayout.setEnabled(true);
  } else if (firstVisibleItem + visibleItemCount == totalItemCount) //If last row is visible. In this case, the last row is the footer.
  {
    if (footer != null) //footer is a variable referencing the footer view of the ListView. You need to initialize this onCreate
    {
      if (listView.getHeight() == footer.getBottom()) { //Check if the whole footer is visible.
        mSwipyRefreshLayout.setDirection(SwipyRefreshLayoutDirection.BOTTOM);
        mSwipyRefreshLayout.setEnabled(true);
      }
    }
  } else
    mSwipyRefreshLayout.setEnabled(false);
}

Joseph Mhanna
sumber
0

Jika Anda menyetel tag pada tampilan item terakhir listview, nanti Anda dapat mengambil tampilan dengan tag tersebut, jika tampilan tersebut nol, itu karena tampilan tersebut tidak dimuat lagi. Seperti ini:

private class YourAdapter extends CursorAdapter {
    public void bindView(View view, Context context, Cursor cursor) {

         if (cursor.isLast()) {
            viewInYourList.setTag("last");
         }
         else{
            viewInYourList.setTag("notLast");
         }

    }
}

lalu jika Anda perlu mengetahui apakah item terakhir dimuat

View last = yourListView.findViewWithTag("last");
if (last != null) {               
   // do what you want to do
}
Dante Carvalho Costa
sumber
0

Janwilx72 benar, tetapi min sdk adalah 21, jadi saya membuat metode ini :

private boolean canScrollList(@ScrollOrientation int direction, AbsListView listView) {
    final int childCount = listView.getChildCount();
    if (childCount == 0) {
        return false;
    }

    final int firstPos = listView.getFirstVisiblePosition();
    final int paddingBottom = listView.getListPaddingBottom();
    final int paddingTop = listView.getListPaddingTop();
    if (direction > 0) {
        final int lastBottom = listView.getChildAt(childCount - 1).getBottom();
        final int lastPos    = firstPos + childCount;
        return lastPos < listView.getChildCount() || lastBottom > listView.getHeight() - paddingBottom;
    } else {
        final int firstTop = listView.getChildAt(0).getTop();
        return firstPos > 0 || firstTop < paddingTop;
    }
}

untuk ScrollOrientation:

protected static final int SCROLL_UP = -1;
protected static final int SCROLL_DOWN = 1;
@Retention(RetentionPolicy.SOURCE)
@IntDef({SCROLL_UP, SCROLL_DOWN})
protected @interface Scroll_Orientation{}

Mungkin terlambat, hanya untuk yang terlambat。

xiaoyee
sumber
0

Jika Anda menggunakan adaptor khusus dengan tampilan daftar Anda (kebanyakan orang melakukannya!) Solusi yang bagus diberikan di sini!

https://stackoverflow.com/a/55350409/1845404

Metode getView adaptor mendeteksi ketika daftar telah di-scroll ke item terakhir. Ini juga menambahkan koreksi untuk saat-saat yang jarang terjadi ketika beberapa posisi sebelumnya dipanggil bahkan setelah adaptor telah memberikan tampilan terakhir.

gbenroscience
sumber
0

Saya melakukan itu dan bekerja untuk saya:

private void YourListView_Scrolled(object sender, ScrolledEventArgs e)
        {
                double itemheight = YourListView.RowHeight;
                double fullHeight = YourListView.Count * itemheight;
                double ViewHeight = YourListView.Height;

                if ((fullHeight - e.ScrollY) < ViewHeight )
                {
                    DisplayAlert("Reached", "We got to the end", "OK");
                }
}
Ahmed Osman
sumber
-5

Ini akan menggulir daftar Anda ke bawah ke entri terakhir.

ListView listView = new ListView(this);
listView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setStackFromBottom(true);
salman khalid
sumber