2010-01-01 26 views
25

Gibt es eine Möglichkeit, dass ich sicherstellen kann, dass ein bestimmtes Objekt in einer Android-Listenansicht vollständig sichtbar ist?auf Android-Listenansicht sichtbar machen?

Ich möchte in der Lage sein, programmgesteuert zu einem bestimmten Element zu blättern, wie wenn ich zum Beispiel eine Taste drücke.

Antwort

20

ListView.setSelection() scrollt die Liste, so dass das gewünschte Element im Ansichtsfenster liegt.

+4

Setselection scrollt es zum Anfang der Ansicht. Ich brauche es nur, um so wenig wie möglich zu bewegen – CodeFusionMobile

+0

Diese Antwort ist nicht genau, wie CodeFusionMobile darauf hingewiesen. Also ich würde es nicht wirklich akzeptieren ... :-( – Zordid

11

Versuchen Sie es:

public static void ensureVisible(ListView listView, int pos) 
{ 
    if (listView == null) 
    { 
     return; 
    } 

    if(pos < 0 || pos >= listView.getCount()) 
    { 
     return; 
    } 

    int first = listView.getFirstVisiblePosition(); 
    int last = listView.getLastVisiblePosition(); 

    if (pos < first) 
    { 
     listView.setSelection(pos); 
     return; 
    } 

    if (pos >= last) 
    { 
     listView.setSelection(1 + pos - (last - first)); 
     return; 
    } 
} 
+6

listView.smoothScrollToPosition (pos); statt setSelection (...) wenn du willst. Danke jauseg. – Saikat

+0

+1 danke dafür! – Olayinka

+0

Hmm. Da ist's Eine kleine Falle: Wenn Sie die Auswahl vor dem Layout vorgenommen haben, gibt es keine letzte sichtbare Position (= -1) und alles bricht ab, Sie müssen sicherstellen, dass dies NACH dem Layout ausgeführt wird funktioniert nicht wie erwartet, aber setzt die Auswahl komplett falsch – Zordid

2

Ich habe eine kürzere und meiner Meinung nach bessere Lösung, um dies zu tun: ListView requestChildRectangleOnScreen-Methode ist dafür ausgelegt.

Die obige Antwort stellt sicher, dass das Element angezeigt wird, aber manchmal wird es teilweise angezeigt (dh wenn es am unteren Rand des Bildschirms ist). Der Code stellt sicher, unten, dass das gesamte Element angezeigt wird, und dass die Sicht nur die notwendige Zone bewegen wird:

private void ensureVisible(ListView parent, View view) { 
    Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
    parent.requestChildRectangleOnScreen(view, rect, false); 
} 
+7

Wenn Sie API 8 oder später verwenden, ist die ListView smoothScrollToPosition() Methode noch eine klügere Lösung. –

+0

Das Problem mit Yves "Antwort ist, dass diese" Ansicht "nicht notwendigerweise existiert ... wenn sie nicht sichtbar ist, wird' ListView' sie wahrscheinlich verworfen haben. Tatsächlich ist 'smoothScrollToPosition' das gute a nswer hier. – RedGlyph

3

Kürzlich traf ich das gleiche Problem, fügen Sie meine Lösung hier, falls jemand braucht es (ich habe versucht, Machen Sie das letzte sichtbare Objekt sichtbar):

if (mListView != null) { 
     int firstVisible = mListView.getFirstVisiblePosition() 
       - mListView.getHeaderViewsCount(); 
     int lastVisible = mListView.getLastVisiblePosition() 
       - mListView.getHeaderViewsCount(); 

     View child = mListView.getChildAt(lastVisible 
       - firstVisible); 
     int offset = child.getTop() + child.getMeasuredHeight() 
       - mListView.getMeasuredHeight(); 
     if (offset > 0) { 
      mListView.smoothScrollBy(offset, 200); 
     } 
    } 
+0

Funktioniert gut! Obwohl ich einen Randfall erwähnen sollte, der eine Codeänderung erfordert: Sie müssen mlistView.post aufrufen (new Runnable() {public void run() {(der obige Code);})}); Dies behandelt den Fall, in dem Sie die Höhe des letzten Kindes ändern (wodurch der Inhalt der ListView größer wird). Wenn Sie eine Runnable-Datei senden, erhält die ListView die Möglichkeit, sich selbst zu aktualisieren, bevor Sie versuchen, zum neuen Ende der Liste zu blättern. – foo64

+1

Leider gibt es eine interne Begrenzung für die Menge, die 'ListView.smoothScrollBy' scrollt. Das liegt daran, dass es intern einen User-Fling simuliert. Wenn Sie diese Methode verwenden, um 10 Bildschirme im Wert von Elementen zu scrollen, scrollen Sie nur durch wenige Bildschirme. – foo64

Verwandte Themen