2010-03-03 9 views
7

Ich möchte die a ListView in Android nach Anzahl der Pixel scrollen. Zum Beispiel möchte ich die Liste 10 Pixel nach unten scrollen (so dass das oberste Element der Liste die obersten 10 Pixelzeilen enthält).Scrollen Sie eine ListView von Pixel in Android

dachte ich, die offensichtlich sichtbar scrollBy oder scrollTo Methoden auf Listview den Job tun würde, aber sie nicht, sondern bewegen sie die gesamte Liste zu Unrecht (In der Tat, die getScrollY immer Null, selbst zurückkehren, obwohl ich die Liste geblättert habe mit Mein Finger.)

Was ich mache ist, dass ich Trackball-Ereignisse erfassen und ich möchte die Listview reibungslos entsprechend der Bewegung des Trackballs scrollen.

+0

Dies ist, was 'scrollby' tun soll. Könnten Sie Ihren Java-Code veröffentlichen? –

+1

Ich denke, scrollBy verwirrt irgendwie die ListView. Ich habe auch damit experimentiert. Es verschiebt die Berührungsereignisse um den Wert scrollBy amount .... Wenn Sie also y zum Beispiel um 10 scrollen, wird das nächste Berührungsereignis auf der Liste 10 Pixel unterhalb der tatsächlichen Touch-Position angezeigt.Entschuldigung, ich kenne keinen besseren Weg, aber vielleicht gibt es eine Möglichkeit, dies mit der onTouch-Methode auf dem listView zu kompensieren. – DArkO

Antwort

10

Die unterstützte Möglichkeit ein ListView Widget zu blättern ist:

mListView.smoothScrollToPosition(position);

http://developer.android.com/reference/android/widget/AbsListView.html#smoothScrollToPosition(int)

jedoch, da Sie ausdrücklich erwähnt, dass Sie die Ansicht vertikal versetzen möchten, rufen Sie müssen:

mListView.setSelectionFromTop(position, yOffset);

http://developer.android.com/reference/android/widget/ListView.html#setSelectionFromTop(int,%20int)

Beachten Sie, dass Sie auch smoothScrollByOffset(yOffset) verwenden können. Es wird jedoch nur auf API unterstützt> = 11

http://developer.android.com/reference/android/widget/ListView.html#smoothScrollByOffset(int)

+0

Außerdem ist smoothScroolToPosition nur API> = 8 :( –

+1

+1 für 'setSelectionFromTop' –

3

Hier ist ein Code aus meiner ListView Unterklasse. Es kann leicht angepasst werden, so dass es im Aktivitätscode verwendet werden kann.

getListItemsHeight() gibt die gesamte Pixelhöhe der Liste zurück und füllt ein Array mit vertikalen Pixeloffsets für jedes Element. Während diese Information gültig ist, gibt getListScrollY() die aktuelle vertikale Pixel-Bildlaufposition zurück, und scrollListToY() scrollt die Liste zur Pixelposition. Ändert sich die Größe oder der Inhalt der Liste, muss getListItemsHeight() erneut aufgerufen werden.

private int m_nItemCount; 
private int[] m_nItemOffY; 

private int getListItemsHeight() 
{ 
    ListAdapter adapter = getAdapter(); 
    m_nItemCount = adapter.getCount(); 
    int height = 0; 
    int i; 

    m_nItemOffY = new int[m_nItemCount]; 

    for(i = 0; i< m_nItemCount; ++i){ 
     View view = adapter.getView(i, null, this); 

     view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

     m_nItemOffY[i] = height; 
     height += view.getMeasuredHeight(); 
    } 

    return height; 
} 

private int getListScrollY() 
{ 
    int pos, nScrollY, nItemY; 
    View view; 

    pos = getFirstVisiblePosition(); 
    view = getChildAt(0); 
    nItemY = view.getTop(); 
    nScrollY = m_nItemOffY[pos] - nItemY; 

    return nScrollY; 
} 

private void scrollListToY(int nScrollY) 
{ 
    int i, off; 

    for(i = 0; i < m_nItemCount; ++i){ 
     off = m_nItemOffY[i] - nScrollY; 
     if(off >= 0){ 
      setSelectionFromTop(i, off); 
      break; 
     } 
    } 
} 
10

Wenn Sie an der Quelle suchen die scrollListBy (Methode) hinzugefügt in api 19 Sie werden sehen, dass Sie das Paket trackMotionScroll Methode scoped verwenden können.

public class FutureListView { 

    private final ListView mView; 

    public FutureListView(ListView view) { 
     mView = view; 
    } 

    /** 
    * Scrolls the list items within the view by a specified number of pixels. 
    * 
    * @param y the amount of pixels to scroll by vertically 
    */ 
    public void scrollListBy(int y) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      mView.scrollListBy(y); 
     } else { 
      // scrollListBy just calls trackMotionScroll 
      trackMotionScroll(-y, -y); 
     } 
    } 

    private void trackMotionScroll(int deltaY, int incrementalDeltaY) { 
     try { 
      Method method = AbsListView.class.getDeclaredMethod("trackMotionScroll", int.class, int.class); 
      method.setAccessible(true); 
      method.invoke(mView, deltaY, incrementalDeltaY); 
     } catch (Exception ex) { 
      throw new RuntimeException(ex); 
     }; 
    } 
} 
+0

Stellen Sie sicher, dass die Hardwarebeschleunigung aktiviert ist. Http://developer.android.com/guide/topics/graphics/hardware-accel.html – enl8enmentnow

+0

Sie Gern geschehen, froh, dass es nützlich war. – enl8enmentnow

0

wenn Sie mit dem Pixel verschieben möchten, dann können u diese verwenden

public void scrollBy(ListView l, int px){ 
    l.setSelectionFromTop(l.getFirstVisiblePosition(),l.getChildAt(0).getTop() - px); 
} 

dies selbst für diejenigen mit massiven Header arbeitet

1

Vorerst ist ListViewCompat wahrscheinlich eine bessere Lösung.

android.support.v4.widget.ListViewCompat.scrollListBy(@NonNull ListView listView, int y) 
Verwandte Themen