2010-07-22 25 views
9

setSelection(), setSelectionFromTop() ve setSelectionAfterHeaderView()'un farkındayım, ancak bunların hiçbiri istediğimi yapmadı.Listenin AyarlanmasıGörüntüleme menüsünü güzelce kaydırın

Listede bir öğe verildiğinde, görünecek şekilde kaydırmak istiyorum. Öğenin listenin görünür penceresinin üzerinde olması durumunda, öğenin listede görünen ilk öğe olmasına kadar kaydırmak istiyorum; Öğe görünür pencerenin altındaysa, listede son görünür öğe olana kadar yukarı kaydırılmasını istiyorum. Öğe zaten görünürse, kaydırmanın gerçekleşmesini istemiyorum.

Bunun için nasıl giderim?

+0

Neden bahsettiğiniz yöntemler işe yaramıyor? İstediğiniz öğede Seçimi ayarladığınızda ne olur? (Bunun eski bir soru olduğunun farkındayım. Şimdiye kadar çözdüyseniz, lütfen çözümünüzü gönderin, minnettarım) – HXCaine

+0

@ T3Roar: Bunu setSelection() ve setSelectionFromTop() birleşimi ile çözdüm. liste yüksekliği ve öğe yüksekliği ve tabii ki öğenin listedeki konumu hakkında endişeleniyor. Bu bir karmaşa, korkarım ve kodu yine de paylaşamıyorum - ama çözülebilir. Belki şansımı yakalarsam, paylaşabileceğim genel bir çözüm yazacağım, ama şu an sahip olduğum şey, içeride olduğum bağlam dışında kullanışlı değil. Üzgünüm! –

+1

Eh, bazı diğer çılgın geçici çözümlerden ziyade, yalnızca setSelection() 'ın bazılarını kullanmasından memnunum. Cevap verdiğiniz için teşekkürler :) – HXCaine

cevap

15

ListView henüz oluşturulmadığından oluşur. olan (8smoothScrollToPosition kullanmak için gereklidir

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

API: o zaman ben buldum

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

sanırım, ben aynı arıyordu aşağıdaki çözümü: çalıştırılabilir gibi göndermek için deneyin farkında olmanız için makul bir minimumdur).

3

Sergey'in yanıtı işe yarayacak, ancak bunu yapmanın doğru yolu, ListView oluşturulduğunda bildirilmek üzere bir gözlemci kurmak olduğuna inanıyorum.

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

Bu daha iyi bir çözümdür ancak dinleyiciyi kaldırmayı unutmayın: http://developer.android.com/reference/android/view/ViewTreeObserver.html#removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener) – Rocel

+0

Teşekkür ederim Rocel. Line listView.getViewTreeObserver(). RemoveGlobalOnLayoutListener (this) bunu yapar –

0

Sergey's answer için daha iyi bir çözüm belki onStart() yılında, Aktivite/Fragment yaşam döngüsünün daha sonra setSelection() aramak. Böylece, bazı keyfi gecikmeler kullanmak yerine Görünümün hazır olduğunu garanti edersiniz.