2012-10-04 13 views
29

मैं यह पता लगाने की कोशिश कर रहा हूं कि किसी सूची दृश्य को पिक्सेल में कुछ निश्चित सीमा से परे स्क्रॉल किया गया है (पहली वस्तु के माध्यम से आधे रास्ते)। दुर्भाग्यवश सूचीदृश्य की getScrollY() हमेशा स्क्रॉल स्थिति के 0 instad को वापस प्रतीत होता है। पिक्सेल द्वारा वास्तविक स्क्रॉल स्थान प्राप्त करने का कोई तरीका है?एंड्रॉइड सूची वर्तमान स्क्रॉल स्थान देखें वाई पिक्सेल

यहाँ कोड मैं का उपयोग करने की कोशिश की है, लेकिन के रूप में कहा कि यह केवल रिटर्न 0.

getListView().setOnScrollListener(new AbsListView.OnScrollListener() { 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     Log.d("scroll", "scroll: " + getListView().getScrollY()); 
    } 

    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if (scrollState == 0) 
     Log.d("scroll", "scrolling stopped"); 
    } 
}); 
+0

सही [समाधान] (http://stackoverflow.com/questions/12727594/android-listview-current-scroll-location- वाई-पिक्सेल/35594825 # 35594825) – Sarasranglt

उत्तर

49

एंड्रॉइड में लिस्ट व्यू के लिए वाई स्क्रॉल की कोई धारणा नहीं है क्योंकि सामग्री की कुल ऊंचाई अज्ञात है। केवल प्रदर्शित सामग्री की ऊंचाई ज्ञात है। Malachiasz के जवाब की

getListView().getChildAt(0).getTop(); 
+1

आप शायद इस समाधान का मतलब http://stackoverflow.com/a/3035521/1276636 – Sufian

+0

यह वास्तव में एक अच्छा संकेत है, thx @Cyril Mottier :) – JakeP

+7

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

0

आप OnTouchListener को लागू करने की कोशिश और उसके onTouch(View v, MotionEvent event) ओवरराइड और event.getX() और event.getY() का उपयोग कर x और y मिल सकता है। मैंने अभी सूची सूची पंक्ति पर स्वाइप करने के लिए एक डेमो बनाया है जो ListView से किसी विशेष आइटम को हटाने के लिए डिलीट बटन सक्षम करेगा। आप मेरे github से स्रोत कोड को ListItemSwipe के रूप में देख सकते हैं।

+4

यह 'मोशनवेन्ट' वेग के आधार पर 'लिस्ट व्यू' स्क्रॉल के बाद वाई-अक्ष का विकल्प नहीं है। –

0

एक refactor कोड:

हालांकि यह संभव है मौजूदा स्थिति/एक दृश्य आइटम निम्नलिखित हैक का उपयोग करने का वाई पुस्तक प्राप्त करने के लिए। यह फ़ंक्शन गतिशील पंक्ति की ऊंचाई के लिए उपयोग किया जाता है।

कॉल Onscroll श्रोता

mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(AbsListView view, int scrollState) { 

      } 

      @Override 
      public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
       if (mCardsListView.getChildCount() > 0) { 
        int scrollY = getScrollY(); 
       } 
      } 
     }); 

getScrollY समारोह

private Dictionary<Integer, Integer> mListViewItemHeights = new Hashtable<Integer, Integer>(); 
private int getScrollY() { 
     View child = mCardsListView.getChildAt(0); //this is the first visible row 
     if (child == null) return 0; 

     int scrollY = -child.getTop(); 

     mListViewItemHeights.put(mCardsListView.getFirstVisiblePosition(), child.getHeight()); 

     for (int i = 0; i < mCardsListView.getFirstVisiblePosition(); ++i) { 
      Integer hei = mListViewItemHeights.get(i); 

      //Manual add hei each row into scrollY 
      if (hei != null) 
       scrollY += hei; 
     } 

     return scrollY; 
    } 
संबंधित मुद्दे