Liste görünümü Listeyi güncelledikten sonra listenin sonuna gidin


292

Listeye girilen son öğeyi görüntüleyecek şekilde listAdapter kullanarak liste görünümünü güncelledikten sonra listenin sonuna kadar kaydırıldığından emin olmak istiyorum. Bunu nasıl yapabilirim ?

Bunu denedim ama şansım yok:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

teşekkür ederim


bunu deneyin deneyin ... messagesListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); messagesListView.setStackFromBottom (doğru);
Superdev

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) sadece adaptör.notifyDataSetChanged çağrıldıktan sonra listView öğesinin aşağı kaydırılmasını sağlar. Bu işe yaramazsa, aşağıdaki yazılarda gördüğünüz gibi bu özelliği xml olarak tanımlamayı deneyin.
tomm

Yanıtlar:


418

Liste verilerinin ne zaman değiştiğini bildiğinizi varsayarsak, liste seçimini son satıra ayarlayarak listeyi manuel olarak aşağıya kaydırmasını söyleyebilirsiniz. Gibi bir şey:

private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

@Bhupendra bu gerekli değil. Warting'in cevabında gösterildiği gibi, ipliksiz de yapabilirsiniz.
sagarpatidar

2
@Bhupendra setSelection () kullanıcı arayüzünü günceller. Görünümde yazı (Runnable) çağırarak, Runnable kodunun android UI iş parçacığında çalıştığından emin olursunuz. UI iş parçacığında olduğunuzu bilmiyorsanız veya başka yollarla bunu sağlamadığınız sürece genellikle bu şekilde yapın.
Mason Lee

5
ayrıca yeni ayarlanmış bir adaptörde yazı kullanmanın ana iş parçacığında olmasını sağlayarak kaydırma animasyonuna neden olduğu ve adaptörün ayarlanmasından hemen sonra setSelection'ın kullanılmasının kaydırma animasyonuna neden olmadığı
Gianluca P.

1
@SaifHamed, Mason Lee tarafından Kevin'in cevabına göre yorumlandığı gibi, kısa listelerin görünümün üstünde, muhtemelen amaçlanan davranış olmayan alt kısım yerine "boş" alana sahip olmasına neden olur.
Mayıs

16
ayrıca myListView.smoothScrollToPosition (myListAdapter.getCount () - 1) kullanabilirsiniz; düzgün kaydırma için
Zar E Ahmer

238

Liste görünümünüzde bu parametreleri kullanmanız gerekir:

  • Kaydırma lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • Listenin başlığını altına yerleştirin lv.setStackFromBottom(true);

Bu parametreleri XML biçiminde de ayarlayabilirsiniz, örn. bunun gibi:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />

27
Bu yaklaşımla, satırların eklendikçe görünümün "alt tarafından yığınlandığını" unutmayın. Bu, kısa listelerin alt kısım yerine görünümün üstünde "boş" alana sahip olacağı anlamına gelir; bu, her zaman istediği şey değildir.
Mason Lee

2
Kısa soru: Kaydırmanın canlandırılmasını sağlamanın bir yolu var mı? Neden şu anda ne zaman ben bildirmekDataSetChanged () hiçbir animasyon ile atlar?!?
Georg

@Georg Cihazınızdaki Geliştirici Seçeneklerindeki animasyonları devre dışı bıraktınız mı?
JonasCz - Monica'yı eski durumuna getir

35

TRANSCRIPT_MODE_ALWAYS_SCROLL ve setSelection kombinasyonu benim için işe yaradı

ChatAdapter adapter = new ChatAdapter(this);

ListView lv = (ListView) findViewById(R.id.chatList);
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
lv.setAdapter(adapter);

adapter.registerDataSetObserver(new DataSetObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        lv.setSelection(adapter.getCount() - 1);    
    }
});

29

Bir düğmeye tıklama yanıt olarak bunu kullanarak başarılı oldum, bu yüzden içeriklerinizi güncelledikten sonra da kullanabilirsiniz sanırım:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);

1
Bu harika bir çözüm. Basit, tek satır.
Josh Larson

12

Bunu bir ListFragment içinde almak için:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);`

Birisi ListFragment ile aynı problem için bir google araması yaparsa bunu bulduğu için bu yanıtı ekledi.

Saygılarımızla


9

Kullanarak: Listenin başını altına yerleştirin lv.setStackFromBottom(true);

Benim için çalıştı ve ilk görünürlük haline getirildiğinde liste otomatik olarak alta kaydırılır. Liste daha sonra olması gerektiği gibi kayar TRANSCRIPT_MODE_ALWAYS_SCROLL.


6
Bu yaklaşımla, satırların eklendikçe görünümün "alt tarafından yığınlandığını" unutmayın. Bu, kısa listelerin görünümün üstünde alt kısım yerine "boş" alana sahip olacağı anlamına gelir.
Mason Lee

5

kullanırım

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

altına giriş eklemek için ve eski girişler sohbet metni gibi üste doğru kaydırılır


getListView().smoothScrollToPosition(getListAdapter.getCount() - 1);Etkinliğin başlangıcında en alta kaydırmak için başlangıçta arayın .
palindrom

4

En basit çözüm:

    listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    listView.setStackFromBottom(true);

3

Konuşma metni modu, Google Talk ve SMS / MMS uygulaması tarafından kullanılır. Öğe eklerken adaptörünüzde notifyDatasetChanged () öğesini doğru mu çağırıyorsunuz?


Evet benim. liste doğru şekilde güncellenir, ancak her zaman üstten başlar. Sadece yeni öğeyi eklemek ve her zaman listenin sonuna kaydırmak için ihtiyacım var.
jramirez

Konuşma metni modu aslında SMS uygulaması tarafından devre dışı bırakılmıştır. Nedenini tam olarak hatırlayamıyorum.
Timmmm
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.