2014-04-28 5 views
11

क्या यह संभव है ?? के रूप में एक शीर्षकSwipeRefreshLayout - रीफ्रेश करने के लिए नीचे स्वाइप करें लेकिन दृश्य को स्थानांतरित नहीं करें

कड़ी चोट नीचे कहा लेआउट ताज़ा करने के लिए लेकिन छड़ी लेआउट उसे नीचे ले जाता नहीं कड़ी चोट gusture साथ

धन्यवाद - मैं SwipeRefreshLayout

+0

जब हम पहली स्थिति में हैं, तो स्वाइप रीफ्रेश लयआउट लाने के लिए, बस मेरे उत्तर पर एक नज़र डालें: http://stackoverflow.com/a/37314774/5373110 नोट: मैंने रीसाइक्लर व्यू का उपयोग किया है, यह ListView के लिए एक ही तर्क होना चाहिए मामूली परिवर्तन के साथ। – Meet

+0

@ मीट, सूची दृश्य में भी कोई तर्क नहीं है। – Rumit

+0

参考 [एक स्वाइप में एक सूची दृश्य में स्क्रॉल नहीं कर सकता है RefreshLayout] (https://stackoverflow.com/questions/27041416/cant-scroll-in-a-listview-in-a-swiperefreshlayout%20%E2%80%9CCan टी% 20scroll% 20in% 20a% 20ListView% 20in% 20a% 20swipeRefreshLayout% E2% 80% 9D) –

उत्तर

12

उपयोग कर रहा हूँ मेरी परीक्षण और त्रुटि के बाद, मैंने पाया

http://www.dailydevbook.de/android-swiperefreshlayout-without-overscroll/

से एक समाधान लोगों के लिए जो SwipeRefreshLayout लागू कर सकते हैं क्रम में, यह

प्राप्त करने के लिए

कदम 1: डाउनलोड android-समर्थन v4 GitHub से (मुक्त स्रोत)

कदम 2: कॉपी अपनी परियोजना src लिए जावा वर्ग निम्नलिखित

  • स्वाइप री freshLayout
  • SwipeProgressBar
  • BakedBezierInterpolator

note1- note2- (इन कक्षाओं को ठीक करें और v4 के बजाय एक दूसरे से स्रोत का उपयोग)

(Refactor SwipeRefreshLayout मूल के साथ भ्रमित रोकने के लिए mySwipeRefreshLayout करने के लिए) कदम 3: अद्यतन कोड उपयोग

  • mySwipeR efreshLayout बजाय
  • SwipeRefreshLayout

चरण 4: अद्यतन लेआउट उपयोग

  • com.yourpackage.mySwipeRefreshLaout बजाय
  • android.support.v4.widget.SwipeRefreshLayout

कदम 5: अपने mySwipeRefreshLayout.java में, खोजने के लिए और वैकल्पिक हल के लिए एक निम्न कोड को बदलने Jongz Puangput को

private void updateContentOffsetTop (int targetTop) { 
     final int currentTop = mTarget.getTop(); 
     if (targetTop> mDistanceToTriggerSync) { 
      targetTop = (int) mDistanceToTriggerSync; 
     } else if (targetTop < 0) { 
      targetTop = 0 ; 
     } 
     // SetTargetOffsetTopAndBottom (targetTop - currentTop); 
     setTargetOffsetTopAndBottom (0); // MOD: Prevent Scroll Down Animation 
    } 
+2

यह इतना बुरा दृष्टिकोण है .. – Luke

+1

कृपया एक बेहतर दृष्टिकोण @Luke प्रदान करें क्योंकि यह 2014 –

+0

का उत्तर है SwipeRefreshLayout का उपयोग करना RecyclerView के साथ सूची नीचे स्क्रॉल नहीं करेगा। फिर भी, मेरा मानना ​​है कि आप ListView का उपयोग कर रहे थे। एलेक्स का जवाब अधिक उपयुक्त है। आपका समाधान, हालांकि सही है, सलाह नहीं दी जाती है क्योंकि आप इन कक्षाओं के भविष्य में सुधार और सुधारों को याद करेंगे। – Luke

4

धन्यवाद, लेकिन मैं एक और समाधान का सुझाव देना चाहते, कि मैं सरल लगता है।

आदेश SwipeRefreshLayout के बच्चे के नीचे खींच आप इस तरह ओवरराइड offsetTopAndBottom विधि के साथ अपने स्वयं के बच्चे दृश्य प्रदान कर सकते रोकने के लिए:

public class FixedRelativeLayout extends RelativeLayout { 

    ... 

    @Override 
    public void offsetTopAndBottom(int offset) { 
     // Ignoring movement from SwipeRefreshLayout 
     super.offsetTopAndBottom(0); 
    } 

} 

वह मेरे लिए काम करता है, आशा है कि यह किसी को भी मदद करेंगे।

23

आप इस तरह से

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); 
}}); 

अगर ListView paddingTop

+1

धन्यवाद +1, मैं डिफ़ॉल्ट रूप से 'सत्य' पर सेट करूंगा क्योंकि जब आपकी सूची खाली होती है तो आप इसे रीफ्रेश करने में सक्षम नहीं होंगे – deadfish

+1

एक आकर्षण की तरह काम करता है, धन्यवाद – karenms

4

मैं भी यही मुद्दा का सामना करना पड़ रहा था है यह कोड काम नहीं करता है की कोशिश करो। इस प्रयास करें:

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

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

     int topRowVerticalPosition = (guidesList == null || 
      guidesList.getChildCount() == 0) ? 0 : guidesList.getChildAt(0).getTop(); 

     swipeContainer.setEnabled(firstVisibleItem == 0 && topRowVerticalPosition >= 0); 
    } 
}); 
0

आप वर्तमान में शीर्ष पर और जानते हुए भी कि आप को अक्षम या SwipeRefreshLayout सक्षम कर सकते हैं द्वारा recycler दृश्य पता कर सकते हैं, मुझे के आप रैखिक लेआउट प्रबंधक या ग्रिड का उपयोग मान लीजिए एक उदाहरण

दे तो आप वहाँ से recycler स्थिति

 LinearLayoutManager mLayoutManager; 
     if (mColumnCount <= 1) { 
      mLayoutManager = new LinearLayoutManager(getBaseContext()); 
     } else { 
      mLayoutManager = new GridLayoutManager(getBaseContext(), mColumnCount); 
     } 

     recyclerAdapter = new RecyclerViewAdapter(allData); 
     mRecycler.setAdapter(recyclerAdapter); 
     mRecycler.setLayoutManager(layoutManager); 

     if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) { 
      swipeRefreshLayout.setEnabled(true); 
     } 
     else{ 
      swipeRefreshLayout.setEnabled(false); 
     } 

तो अपने recycler स्क्रॉल ठीक काम करते हैं और अगर होगा शीर्ष swipeRefreshLayout ताज़ा घटना को संभालने तक पहुँचने ... पता लगा सकते हैं

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

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