Pertanyaan Mengatur posisi scroll ListView dengan baik di Android


saya sadar atas setSelection(), setSelectionFromTop(), dan setSelectionAfterHeaderView(), tetapi tidak satupun dari mereka tampaknya melakukan apa yang saya inginkan.

Mengingat item dalam daftar, saya ingin menggulir sehingga terlihat. Jika item berada di atas jendela yang terlihat dari daftar, saya ingin menggulir hingga item tersebut adalah item pertama yang terlihat dalam daftar; jika item berada di bawah jendela yang terlihat, saya ingin menggulirnya hingga menjadi item terakhir yang terlihat dalam daftar. Jika item sudah terlihat, saya tidak ingin ada gulir terjadi.

Bagaimana saya melakukannya?


9
2017-07-22 21:06


asal


Jawaban:


Ini terjadi karena listView belum dibuat. Cobalah untuk mengirim runnable seperti:

getListView().postDelayed(new Runnable() {          
    @Override
    public void run() {
        lst.setSelection(15);
    }
},100L);

15
2017-07-29 12:36



Saya pikir, saya mencari hal yang sama, kemudian saya menemukan solusi berikut:

if (listview.getFirstVisiblePosition() > pos 
    || listview.getLastVisiblePosition() <= pos) {
    listview.smoothScrollToPosition(pos);
}

API 8 wajib digunakan smoothScrollToPosition (yang merupakan wajar minimum yang wajar) sehingga Anda sadar.


4
2017-12-04 10:13



Jawaban Sergey berhasil, tetapi saya percaya bahwa cara yang tepat untuk melakukan ini adalah menyiapkan pengamat agar diberi tahu ketika ListView telah dibuat.

listView.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() {
 @Override
 public void onGlobalLayout() {
     scrollTo(scrollToPosition);
     listView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
 }
});

3
2018-03-31 20:55



Solusi yang lebih baik untuk Jawaban Sergey adalah menelepon setSelection() kemudian dalam siklus hidup Aktivitas / Fragmen, mungkin dalam onStart(). Dengan cara itu, Anda memiliki jaminan bahwa View siap daripada menggunakan beberapa penundaan sewenang-wenang.


0
2017-09-10 20:21