Android ListView'da programlı olarak belirli bir konuma kaydırma


157

Programlı olarak a'daki belirli bir konuma nasıl kayabilirim ListView?

Örneğin, bir var String[] {A,B,C,D....}ve üst görünür öğeyi ListViewbenim dizin 21 için ayarlamanız gerekir String[].



cevabımı burada görebilirsiniz, stackoverflow.com/a/29345217/1881527
Melbourne Lopes

Yanıtlar:


386

Doğrudan kaydırma için:

getListView().setSelection(21);

Yumuşak bir kaydırma için:

getListView().smoothScrollToPosition(21);

Harika, tam da istediğim bu!
jiasli

Harika, çok kullanışlı. Zamandan tasarruf ediyor. Teşekkürler.
Neha Agarwal

Başka bir fark: birincisi listenin ortasında belirlemeye çalışır.
Victor Pinto

11
smoothScrollToPositionçalışmıyor, herhangi bir öneri?
SweetWisher ツ

1
@SweetWisher ution yürütmeyi geciktirmeye çalışın, şuna benzer:listView.post(() -> listView.smoothScrollToPosition());
Andy Res

64

Kaydırma süresine sahip bir SmoothScroll için:

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

Parametreler
konumu -> Kaymaya kaydırılacak
konum ----> Kaydırma tamamlandığında görünümün üstünden konumun piksel cinsinden istenen mesafesi-> Kaydırma
için kullanılacak milisaniye sayısı

Not: API 11'den.

HandlerExploit'in cevabı aradığım şeydi, ancak Liste görünümüm oldukça uzun ve aynı zamanda alfabe kaydırma aracıyla. Sonra aynı fonksiyonun diğer parametreleri de alabileceğini buldum :)


Düzenleme: (AFD'lerin önerisinden)

Geçerli seçimi konumlandırmak için:

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

mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);  

İyi çalışıyor. Cevabınızı iyileştirmek için ofset stackoverflow.com/questions/5540223/…
AFD

v.getHeight () nedir?
Panache

@Panache v listview'in
satırıdır

seni seviyorumuuuuuu
Joao Ferreira

10

Kodunuzu aşağıdaki gibi işleyiciye koyun,

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); 
    }

ve sonra bu yöntemi

timerDelayRunForScroll(100);

ŞEREFE !!!


7

OnGroupExpandListener ayarladım ve onGroupExpand () geçersiz kılma:

ve seçili öğeyi ayarlayan ve seçimi y piksellerini ListView'in üst kenarından konumlandıran setSelectionFromTop () yöntemini kullanın. (Dokunmatik moddaysa, öğe seçilmez ancak yine de uygun şekilde konumlandırılır.) (Android dokümanlar)

    yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
    {

        @Override
        public void onGroupExpand(int groupPosition) {

            expList.setSelectionFromTop(groupPosition, 0);
            //your other code
        }
    });

Lisview kaydırırken aynı anda başka bir görünüm kaydırmak gerekir. Kaydırma için liste görünümünde setSelectionFromTop öğesinin kullanılması, başka bir görünümün kaydırılmasını yavaşlatan UI iş parçacığını engeller. Nasıl yapılacağına dair bir öneri verebilir misiniz?
VijayRaj

7

ListviewGörünmüyorsa o zaman bu kullanırsanız kaydırma kaydırma varsayılan olarak üstüne konumlandırılmış, ama istiyorum edilecektir:

if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
            listView1.setSelection(position);

Teşekkürler @zalak Sorunumu çöz,
pes

5

Gmail uygulaması gibi benzer bir işlev arayan biri varsa,

Liste görünümü kaydırma varsayılan olarak en üste yerleştirilir. İpucu için teşekkürler. amalBit. Sadece çıkartın. Bu kadar.

 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);

4

Düğmesini kullanarak YUKARI / Aşağı düğmelerini kullanarak kaydırmayı görüntüleyin.

Birisi listeyi işlemekle ilgileniyorsa düğmesini kullanarak bir satır yukarı / aşağı görüntüleyin. sonra.

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

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

}
});

Size şu anki pozisyonu almanın bir yolunu gösteren tek kişi olduğunuz için oy vermek istiyorum, ancak örneği geliştirmelisiniz.
Panciz

4

Bir listede doğrudan istenen konuma atlamak istiyorsanız

listView.setSelection (int konumu);

ve sorunsuz bir şekilde listeden istediğiniz konuma atlamak istiyorsanız

listView.smoothScrollToPosition (int konumu);


3

Bu benim için işe yaradı. AmalBit ve Melbourne Lopes tarafından verilen cevapların kombinasyonu

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); 
}

ve sonra şu yöntemi çağırın:

timerDelayRunForScroll(400);

1

onun kolay liste görünümü. set seçimi (konum); ya da konumunuzu paylaşılan ön ödeme ile kaydedebilirsiniz ve aktiviteye başladığınızda o int tercihlerini ve ayarını alırsınız.


tüm yapmak istediğim, herhangi bir kaydırma animasyonu olmadan otomatik olarak listenin en üstüne taşınmaktı ... Bu mükemmel çalıştı
RH201

1

-Listenin sadece yukarı doğru \ şafakın belirli bir konuma gelmesini istiyorsanız:

myListView.smoothScrollToPosition(i);

- myListView'da belirli bir öğenin konumunu almak istiyorsanız:

myListView.getItemAtPosition(i);

-Ayrıca bu myListView.getVerticalScrollbarPosition(i);size yardımcı olabilir.

İyi şanslar :)


0

Bir listenin kaydırma konumunu tam olarak tanımlamak için iki şeye ihtiyacınız vardır

Geçerli listeyi görüntülemek için Kaydırma konumunu görüntüleyin:

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

ListView Kaydırma konumunu ayarlamak için:

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

-1

Bu çözümü iki farklı düğme kullanarak yukarı ve aşağı kaydırmaya izin vermek için buldum.

@Nepster tarafından önerildiği gibi mevcut konumu almak için getFirstVisiblePosition () ve getLastVisiblePosition () kullanarak kaydırma programlı olarak uygulamak.

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);
                    }

                }
            });
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.