2010-03-03 2 views
7

में पिक्सल द्वारा एक सूची दृश्य को स्क्रॉल करें, मैं पिक्सेल की संख्या से एंड्रॉइड में ListView स्क्रॉल करना चाहता हूं। उदाहरण के लिए मैं सूची 10 पिक्सल नीचे स्क्रॉल करना चाहता हूं (ताकि सूची में पहली आइटम में शीर्ष 10 पिक्सेल पंक्तियां छिपी हों)।एंड्रॉइड

मैंने सोचा था कि ListView पर स्पष्ट रूप से दिखाई दे रहा scrollBy या scrollTo तरीकों काम करते हैं, लेकिन वे नहीं होते, बल्कि वे पूरी सूची को गलत तरीके से स्क्रॉल है (वास्तव में, getScrollY हमेशा शून्य वापसी भले ही मैं का उपयोग कर सूची स्क्रॉल किया है मेरी उंगली।)

मैं जो कर रहा हूं वह है कि मैं ट्रैकबॉल घटनाओं को कैप्चर कर रहा हूं और मैं ट्रैकबॉल की गति के अनुसार आसानी से सूचीदृश्य स्क्रॉल करना चाहता हूं।

+0

यही 'स्क्रॉलबी' करना है। क्या आप अपना जावा कोड पोस्ट कर सकते हैं? –

+1

मुझे लगता है कि स्क्रॉल किसी भी तरह सूची सूची को गड़बड़ कर देता है। मैं भी उस के साथ प्रयोग कर रहा हूँ। यह स्क्रॉल द्वारा टच इवेंट्स को ले जाता है। राशि .... इसलिए यदि आप वाई स्क्रॉल को 10 तक सेट करते हैं तो उदाहरण के लिए सूची में अगला टच इवेंट एक्ट्यूअल टच लोकेशन के नीचे बाजार 10 पिक्सेल होगा ..खेद है कि मुझे बेहतर तरीके से पता नहीं है, लेकिन हो सकता है कि इस चीजों को सूची दृश्य पर टच विधि के साथ क्षतिपूर्ति करने का कोई तरीका हो। – DArkO

उत्तर

10

एक ListView विजेट स्क्रॉल करने के लिए समर्थित तरीका है:

mListView.smoothScrollToPosition(position);

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

लेकिन जब से आप विशेष रूप से उल्लेख किया है कि आप खड़ी दृश्य ऑफसेट करने के लिए चाहते हैं, तो आप कॉल करना होगा:

mListView.setSelectionFromTop(position, yOffset);

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

ध्यान दें कि आप smoothScrollByOffset(yOffset) का भी उपयोग कर सकते हैं। लेकिन यह केवल API पर समर्थित है> = 11

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

+0

इसके अलावा, smoothScroolToPosition केवल API> = 8 :( –

+1

'setSelectionFromTop' –

3

यहाँ मेरी ListView उपवर्ग से कुछ कोड है। इसे आसानी से अनुकूलित किया जा सकता है ताकि इसका उपयोग गतिविधि कोड में किया जा सके।

getListItemsHeight() सूची की कुल पिक्सेल ऊंचाई देता है, और प्रत्येक आइटम के लंबवत पिक्सेल ऑफसेट के साथ एक सरणी भरता है। हालांकि यह जानकारी मान्य है, getListScrollY() वर्तमान लंबवत पिक्सेल स्क्रॉल स्थिति देता है, और scrollListToY() सूची को पिक्सेल स्थिति में स्क्रॉल करता है। यदि सूची का आकार या सामग्री बदलती है, तो getListItemsHeight() को फिर से कॉल करना होगा।

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

आप विधि scrollListBy() API 19 में जोड़ा के लिए स्रोत को देखें, तो आप उपयोग कर सकते हैं कि पैकेज scoped trackMotionScroll विधि देखेंगे।

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

के लिए +1 है सुनिश्चित करें कि हार्डवेयर त्वरण चालू है। Http://developer.android.com/guide/topics/graphics/hardware-accel.html – enl8enmentnow

+0

आप स्वागत है, खुशी है कि यह उपयोगी था। – enl8enmentnow

0

अगर आप पिक्सल द्वारा ले जाना चाहते हैं तो यू इस

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

यह और भी बड़े पैमाने पर हेडर

1

अभी के लिए के साथ लोगों के लिए काम करता है का उपयोग कर सकते, ListViewCompat शायद एक बेहतर समाधान है।

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