Gulir secara terprogram ke posisi tertentu di Android ListView

Jawaban:

386

Untuk gulir langsung:

getListView().setSelection(21);

Untuk gulir yang lancar:

getListView().smoothScrollToPosition(21);
HandlerExploit
sumber
Keren, ini persis yang saya inginkan!
jiasli
Hebat, Sangat berguna. Menghemat waktu saya. Terima kasih.
Neha Agarwal
Perbedaan lain: yang pertama mencoba untuk mengatur di tengah daftar.
Victor Pinto
11
smoothScrollToPositiontidak berfungsi, ada saran?
SweetWisher ツ
1
@SweetWisher ツ coba tunda penundaan eksekusi, seperti:listView.post(() -> listView.smoothScrollToPosition());
Andy Res
64

Untuk SmoothScroll dengan durasi Gulir:

getListView().smoothScrollToPositionFromTop(position,offset,duration);


Posisi parameter -> Posisi yang akan digulir untuk
mengimbangi ----> Jarak yang diinginkan dalam piksel posisi dari atas tampilan ketika pengguliran selesai
durasi-> Jumlah milidetik untuk digunakan untuk gulir

Catatan: Dari API 11.

Jawaban HandlerExploit adalah apa yang saya cari, tetapi listview saya cukup panjang dan juga dengan scroller alfabet. Kemudian saya menemukan bahwa fungsi yang sama dapat mengambil parameter lain juga :)


Edit: (Dari saran AFD)

Untuk memposisikan pilihan saat ini:

int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  
amalBit
sumber
Bekerja dengan baik. Untuk meningkatkan jawaban Anda, offset dapat dihitung seperti yang dijelaskan di stackoverflow.com/questions/5540223/…
AFD
Apa itu v.getHeight ()?
Panache
@Panache v adalah deretan listview
amalBit
aku cinta kamuuuuuu
Joao Ferreira
10

Masukkan kode Anda di handler sebagai berikut,

public void timerDelayRunForScroll(long time) {
        Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() {           
            public void run() {   
                try {
                    lstView.smoothScrollToPosition(YOUR_POSITION);
                } catch (Exception e) {}
            }
        }, time); 
    }

dan kemudian memanggil metode ini seperti,

timerDelayRunForScroll(100);

BERSULANG!!!

Melbourne Lopes
sumber
7

Saya telah menetapkan OnGroupExpandListener dan menimpa onGroupExpand () sebagai:

dan gunakan metode setSelectionFromTop () yang Menetapkan item yang dipilih dan menempatkan pemilihan piksel y dari tepi atas ListView. (Jika dalam mode sentuh, item tidak akan dipilih tetapi masih akan diposisikan dengan tepat.) (Dokumen android)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });
Lab Inet
sumber
Saya perlu menggulir tampilan lain secara bersamaan saat menggulir lisview. Menggunakan setSelectionFromTop pada tampilan daftar untuk pengguliran memblokir utas UI yang membuat pengguliran tampilan lain menjadi lambat. Bisakah Anda memberikan saran bagaimana melakukannya?
VijayRaj
7

The Listviewgulir akan diposisikan ke atas secara default, tetapi ingin gulir jika tidak terlihat maka menggunakan ini:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);
Zalak Gajjar
sumber
Terima kasih @alak Selesaikan masalah saya, Menyerah
Mitul Bhadeshiya
5

Jika seseorang mencari fungsi serupa seperti aplikasi Gmail,

Gulir Listview akan diposisikan ke atas secara default. Terima kasih atas petunjuknya. amalBit. Kurangi saja. Itu dia.

 Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            int h1 = mDrawerList.getHeight();
            int h2 = header.getHeight();
            mDrawerList.smoothScrollToPosition(h2-h1);
        }
    }, 1000);
EngineSense
sumber
4

Menangani daftar Lihat menggulir menggunakan ATAS / Bawah menggunakan tombol

Jika seseorang tertarik menangani listView satu baris naik / turun menggunakan tombol. kemudian.

public View.OnClickListener onChk = new View.OnClickListener() {
             public void onClick(View v) {

                 int index = list.getFirstVisiblePosition();
                 getListView().smoothScrollToPosition(index+1); // For increment. 

}
});
Zar E Ahmer
sumber
Saya memberikan Anda suara hanya karena Anda adalah satu-satunya yang menunjukkan cara untuk mendapatkan posisi saat ini, tetapi Anda harus meningkatkan contoh.
Panciz
4

Jika Anda ingin melompat langsung ke posisi yang diinginkan dalam listView gunakan saja

listView.setSelection (posisi int);

dan jika Anda ingin melompat dengan lancar ke posisi yang diinginkan di listView gunakan saja

listView.smoothScrollToPosition (posisi int);

Vijay
sumber
3

Inilah yang bekerja untuk saya. Kombinasi jawaban oleh amalBit & Melbourne Lopes

public void timerDelayRunForScroll(long time) {
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {           
        public void run() {   
            try {
                  int h1 = mListView.getHeight();
                  int h2 = v.getHeight();

                  mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);  

            } catch (Exception e) {}
        }
    }, time); 
}

dan kemudian panggil metode ini seperti:

timerDelayRunForScroll(400);
Prasanna Ramaswamy
sumber
1

pemilihan list-view.set yang mudah (Anda pos); atau Anda dapat menyimpan posisi Anda dengan prefrence bersama dan ketika Anda memulai aktivitas itu mendapatkan preferensi dan setelion untuk int itu

janatan
sumber
semua yang ingin saya lakukan adalah secara otomatis pindah ke bagian atas daftar, tanpa animasi scrolling ... ini bekerja dengan baik untuk itu
RH201
1

-Jika Anda hanya ingin daftar bergulir \ fajar ke posisi tertentu:

myListView.smoothScrollToPosition(i);

-jika Anda ingin mendapatkan posisi item tertentu di myListView:

myListView.getItemAtPosition(i);

-juga ini myListView.getVerticalScrollbarPosition(i);bisa membantu kamu.

Semoga berhasil :)

Basil Rawa
sumber
0

Anda memerlukan dua hal untuk menentukan posisi gulir listView secara tepat:

Untuk mendapatkan daftar saat ini, Lihat posisi Gulir:

int firstVisiblePosition = listView.getFirstVisiblePosition(); 
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.

Untuk mengatur listView posisi Gulir:

listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo.. 
listView.scrollTo(0,-topEdge);
Rahul Ogale
sumber
-1

Saya menemukan solusi ini untuk memungkinkan gulir ke atas dan ke bawah menggunakan dua tombol yang berbeda.

Seperti yang disarankan oleh @Nepster saya mengimplementasikan gulir secara terprogram menggunakan getFirstVisiblePosition () dan getLastVisiblePosition () untuk mendapatkan posisi saat ini.

final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
    .....

        if (list.size() > 0) {
            ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
            bnt.setVisibility(View.VISIBLE);
            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
                        lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
                    }else{
                        lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());

                    }
                }
            });
            bnt = (ImageButton) findViewById(R.id.up_action);
            bnt.setVisibility(View.VISIBLE);

            bnt.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    if(lwresult.getFirstVisiblePosition()>0){
                        lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
                    }else{
                        lwresult.smoothScrollToPosition(0);
                    }

                }
            });
        }
Panciz
sumber