2014-07-17 6 views
5

रीफ्रेश करने के लिए लेआउट स्क्रॉल करें मैंने अपने ग्रिड व्यू के लिए एक स्वाइप रीफ्रेश लेआउट लागू किया है और अगर मैं ताज़ा करने के लिए नीचे स्क्रॉल (स्क्रॉल) नीचे खींचता हूं तो यह पूरी तरह से काम करता है।एंड्रॉइड स्वाइप रीफ्रेश लेआउट स्क्रॉल करने के लिए

हालांकि, मैं यह पता लगाने की कोशिश कर रहा हूं कि उपयोगकर्ता स्क्रॉल करते समय रीफ्रेश कैसे करें। तो जब उपयोगकर्ता ग्रिड में अंतिम आइटम तक पहुंचता है (मेरी सीमा 10 है) तो जब उपयोगकर्ता सभी दस देखता है और फिर ऊपर खींचता है या स्क्रॉल करना जारी रखने का प्रयास करता है तो मैं फिर रीफ्रेश कैसे कर सकता हूं?

किसी भी मदद की सराहना की जाती है।

उत्तर

5

इसलिए लोग या तो: इस प्रश्न का उत्तर नहीं जानते हैं या बी: वे ज्ञान साझा करने के इच्छुक नहीं हैं।

वैसे भी लंबे समय बाद मैं अपने स्वयं के समाधान के साथ आया। मैं अपने ग्रिड से एक स्क्रॉल श्रोता जोड़ा, और गणना की है जब मैं स्क्रीन के नीचे करने के लिए स्क्रॉल, इस बिंदु पर मैं कड़ी चोट ताज़ा करने के लिए से onRefresh() विधि को याद ...

संपादित आगे कोई जानकारी जोड़ने की

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

 worldBeersGrid.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView absListView, int i) { 

     } 
     @Override 
     public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      int position = firstVisibleItem+visibleItemCount; 
      int limit = totalItemCount; 
      int totalItems = sharedpreferences.getInt("WORLD ITEM COUNT", 0); 

      Log.i("TOTAL WORLD ITEMS", String.valueOf(totalItems)); 
      Log.i("LIMIT :::::::::::: ", String.valueOf(limit)); 
      Log.i("POSITION ::::::::::::", String.valueOf(position)); 
      Log.i("REFRESHING :::::::::::::::", String.valueOf(swipeRefreshLayout.isRefreshing())); 

      if(position>=limit && totalItemCount>0 && !swipeRefreshLayout.isRefreshing() && position <totalItems){ 
       swipeRefreshLayout.setRefreshing(true); 
       //In the below method I made my call to my ws... 
       onRefresh(); 
      } 
     } 
    }); 
+1

अरे @ डीजे डू, मैं सिर्फ इस व्यवहार नकल की कोशिश की और परेशानी हो रही हूँ। मैंने अपने ग्रिडव्यू पर शुरुआती ताज़ा करने के लिए http://nlopez.io/swiperefreshlayout-with-listview-done-right/ का उपयोग किया, लेकिन मुझे मेरी सूची के नीचे कहां गणना करने में समस्या हो रही है। क्या आप अपना जवाब संपादित कर सकते हैं कि आपने नीचे की गणना कैसे की? धन्यवाद! –

3

आप इस तरह से

listView.setOnScrollListener(new OnScrollListener() { 

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
} 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    boolean enable = false; 
    if(listView != null && listView.getChildCount() > 0){ 
     // check if the first item of the list is visible 
     boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; 
     // check if the top of the first item is visible 
     boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; 
     // enabling or disabling the refresh layout 
     enable = firstItemVisible && topOfFirstItemVisible; 
    } 
    swipeRefreshLayout.setEnabled(enable); 
}}); 
5

Android समर्थन लाइब्रेरी संस्करण 21 से में stackoverflow

SwipeRefreshLayout मेरा उत्तर देखें नीचे से पुल का समर्थन नहीं करता प्रयास करें। मैंने संशोधन किया है SwipeRefreshLayoutBottom मूल SwipeRefreshLayout कोड पर आधारित है। यह पूरी तरह से निर्देशांक के नए विचलन और नए writed canChildScrollDown विधि के साथ मूल Google कोड पर आधारित है। सभी संशोधन TODO के रूप में चिह्नित हैं।

Bitbucker repository

2

एक और जवाब है, तो किसी को भी अभी भी रुचि है। स्क्रॉल करते समय रीफ्रेश करने के लिए, मैंने swipeRefreshLayout पर onRefreshListerner() को कार्यान्वित किया है।

swipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swipe_messages); 
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      swipeRefreshLayout.setRefreshing(true); 

      (new Handler()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        refresh(); 
       } 
      }, 1000); 
     } 
    }); 

लेकिन क्रम में जब तक स्क्रॉल ताज़ा करने के लिए और केवल जब मैं सूची के अंत में मिल गया है, मैं सूची जो swipeRefreshLayout शामिल पर OnTouchListener() क्रियान्वित किया है।setRefreshing (सही) प्रभाव शुरू करने के लिए:

public void refresh(){ 
    //Do something neat here to refresh your list 
    swipeRefreshLayout.setRefreshing(false); 
} 

मैं इस उत्तर का उपयोग किया है पता करने के लिए जब मैं करने के लिए मिल गया है:

listView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (listView.getLastVisiblePosition() == listView.getAdapter().getCount() -1 && 
         listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight()) 
       { 

        swipeRefreshLayout.setRefreshing(true); 

        (new Handler()).postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          refresh(); 
         } 
        }, 1000); 

       } 
      } 
      return false; 
     } 
    }); 
बेशक

आप अपनी सूची को अद्यतन करने के बाद swipeRefreshLayout निष्क्रिय करने के लिए है सूची के अंत:

https://stackoverflow.com/a/10235887/6144027

संबंधित मुद्दे