2015-02-20 7 views
14

अंतहीन स्क्रॉल पैटर्न को लागू करने में RecyclerView को मैं क्योंकि EndlessScrollAdapter डेटा के दोनों के लिए जिम्मेदार हो सकता है और घटना से निपटने के लिए स्क्रॉल करना चाहिए की तरहक्यों RecyclerView.OnScrollListener एक इंटरफेस नहीं बल्कि एक अमूर्त वर्ग है?

public class EndlessScrollAdapter<VH extends ViewHolder> 
     extends RecyclerView.Adapter<VH> implements RecyclerView.OnScrollListener { 
} 

एक वर्ग बनाना चाहते हैं, इस इसे लागू करने के लिए सबसे आसान तरीका है।

लेकिन, क्योंकि recyclerview-v7-21.0.3 में, OnScrollListener इस

/** 
* An OnScrollListener can be set on a RecyclerView to receive messages 
* when a scrolling event has occurred on that RecyclerView. 
* 
* @see RecyclerView#setOnScrollListener(OnScrollListener) 
*/ 
abstract static public class OnScrollListener { 
    /** 
    * Callback method to be invoked when RecyclerView's scroll state changes. 
    * 
    * @param recyclerView The RecyclerView whose scroll state has changed. 
    * @param newState  The updated scroll state. One of {@link #SCROLL_STATE_IDLE}, 
    *      {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}. 
    */ 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState){} 

    /** 
    * Callback method to be invoked when the RecyclerView has been scrolled. This will be 
    * called after the scroll has completed. 
    * 
    * @param recyclerView The RecyclerView which scrolled. 
    * @param dx The amount of horizontal scroll. 
    * @param dy The amount of vertical scroll. 
    */ 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy){} 
} 

की तरह घोषित मैं EndlessScrollAdapter लागू OnScrollListener नहीं कर सकता।

इसलिए शीर्षक कहता है, क्या OnScrollListener के लिए इंटरफ़ेस की बजाय कक्षा होने का कोई अच्छा कारण है? क्योंकि मुझे लगता है कि यह एक इंटरफ़ेस होना चाहिए।

उत्तर

13

मैं एक ही सवाल था, और यह निश्चित रूप से, डिजाइन के रूप में के रूप में इस बग रिपोर्ट में जवाब है:

https://code.google.com/p/android/issues/detail?id=79283

सार कक्षाएं मौजूदा कार्यान्वयन को तोड़ने के बिना ढांचे को नए तरीकों को जोड़ने की अनुमति देती हैं।

इसके अलावा diff है कि यह शुरू की यहां पाया जा सकता:

https://android.googlesource.com/platform/frameworks/support/+/cef7b49%5E!/

यह परिवर्तन स्क्रॉल संबंधित कॉलबैक करने के लिए पहली बार एक पैरामीटर के रूप में RecyclerView कहते हैं।

यह एक बग भी फैक्स करता है जहां स्क्रॉल कॉलबैक को वास्तविक स्क्रॉल राशि के बजाय इच्छित स्क्रॉल राशि कहा जाता है।

मैंने इसे भविष्य में परिवर्तनों को आसान बनाने के लिए इंटरफेस के बजाय एक अमूर्त वर्ग के रूप में भी बदल दिया।

सुनिश्चित नहीं है कि मैं व्यक्तिगत रूप से परिवर्तन से सहमत हूं, लेकिन वहां जा रहा हूं।

+5

गरीब डिजाइन पसंद के बारे में बात करते हैं बनाने के लिए ... – marmor

+0

कारण पर उल्लेख किया प्रतिबद्धता है "भविष्य में बदलावों को आसान बनाने के लिए मैंने इसे एक इंटरफेस के बजाय एक अमूर्त वर्ग भी बदल दिया।" लेकिन किसी को भविष्य के आधार पर बदलाव नहीं करना चाहिए, क्योंकि इस मामले में, यह वर्ग कभी नहीं बदलेगा और यह निश्चित रूप से इसके बाकी के जीवन के लिए एक इंटरफ़ेस हो सकता है। यह दो साल हो गया है और यह अभी भी वही है। – LeonardoSibela

6

मैं एंडलेस स्क्रॉल एडाप्टर को ऑनस्क्रॉल लिस्टर लागू नहीं कर सकता।

यह सच है, लेकिन आप एक समर्पित वर्ग हो सकता है extends RecyclerView.OnScrollListener (RecyclerView.OnScrollListener की एक ठोस उदाहरण)। उदाहरण के लिए

private class MyScrollListener extends RecyclerView.OnScrollListener { 
    // abstract methods implemenations 
} 

और आप क्या जरूरत है तो बस

mRecyclerView.addOnScrollListener(new MySCrollListener()); 
0
yourRecyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
     } 
    }); 
1

विचार से बचने के लिए अपने metdod

... 
recyclerView.addOnScrollListener(new ScrollListener()); 
... 

में श्रोता सेट और एक आंतरिक श्रोता वर्ग

private class ScrollListener extends RecyclerView.OnScrollListener { 
    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState){ 
     // your code there 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     // your code there 
    } 
} 
+0

हालांकि 'setOnscrollListener' को सीधे रीसाइक्लिंग व्यू के उदाहरण पर कॉल करना बहिष्कृत किया गया है, इस बारे में इस तरह से एक आकर्षण की तरह काम करता है। धन्यवाद! –

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