2015-11-17 5 views
44

मैं पहली पंक्ति में पैडिंग/मार्जिन नीचे जोड़ने और पहली पंक्ति में पैडिंग/मार्जिन टॉप जोड़ने की कोशिश कर रहा हूं। मैं इसे आइटम एक्सएमएल में नहीं कर सकता क्योंकि यह मेरे सभी बच्चों को प्रभावित करेगा।रीसाइक्लर में पिछले बच्चे में मार्जिन/पैडिंग

मैं अपने RecyclerView एडाप्टर में हेडर और बच्चे है तो मैं

android:padding="4dp" 
    android:clipToPadding="false" 

उपयोग नहीं कर सकते मैं उपयोग ItemDecoration प्रत्येक हेडर के अंतिम पहली पंक्ति पर

+0

उपयोग इस तरह: Dev

+0

आप दृश्य धारक पर गद्दी और onBindViewHolder में मार्जिन को बदल सकता है और उसके बाद फोन setIsRecyclable (गलत) – user3425867

उत्तर

22

व्यक्तिगत रूप से इसका इस्तेमाल करने की जरूरत है:

private class SpacesItemDecoration extends RecyclerView.ItemDecoration { 
    private int space; 

    public SpacesItemDecoration(int space) { 
     this.space = space; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     if(parent.getChildAdapterPosition(view) == state.getItemCount()-1){ 
      outRect.bottom = space; 
      outRect.top = 0; //don't forget about recycling... 
     } 
     if(parent.getChildAdapterPosition(view) == 0){ 
      outRect.top = space; 
      outRect.bottom = 0; 
     } 
    } 
} 

और

//8dp as px, value might be obtained e.g. from dimen resources... 
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, 
      getResources().getDisplayMetrics()); 
recyclerView.addItemDecoration(new SpacesItemDecoration(space)); 
+1

अरे यह RecyclerView.ItemDecoration की तरह प्रतीत नहीं होता संसाधन वर्ग को और भी प्राप्त करें, मैंने इसे अभी एक तर्क के रूप में जोड़ा है कन्स्ट्रक्टर में प्रवेश करें। – Krtko

+1

गूग समाधान! उलटा लेआउट समर्थन के साथ: https://gist.github.com/Miha-x64/4e8754e72a1e65e3ca742744ea501f16 –

+0

यह उत्तर ऊंचा होना चाहिए! यद्यपि सबिन सेबेस्टियन का जवाब अच्छा काम कर रहा है, हालांकि, आइटमडिक्शन रिक्त स्थान के बराबर नहीं हैं। – iroiroys

26

शीर्ष और निचले आइटम दोनों में पैडिंग जोड़ने के बजाय, आप अपने रीसाइक्लिंग व्यू के ऊपर और नीचे पैडिंग जोड़ सकते हैं और विशेषता false पर सेट कर सकते हैं।

<android.support.v7.widget.RecyclerView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clipToPadding="false" 
    android:paddingTop="8dp" 
    android:paddingBottom="8dp" /> 
+0

यह आसान समाधान है, लेकिन मेरे पास रीसाइक्लर व्यू में हेडर और बच्चे हैं इसलिए मैं इसका उपयोग नहीं कर सकता – RedEagle

+0

@RedEagle कोशिश करें और देखें कि क्या आपको वांछित प्रभाव मिलता है लेकिन मुझे यकीन है कि यह काम करता है। –

+1

मुझे यह जवाब चाहिए, धन्यवाद :) –

87

यह समस्या हल करने के लिए भी आसान है। आप RecylerView पर आवश्यक पैडिंग लागू कर सकते हैं और clipToPadding को गलत पर सेट कर सकते हैं, अन्यथा, पैडिंग आपके स्क्रॉलिंग क्षेत्र को काट देगा। यहां एक उदाहरण है

<android.support.v7.widget.RecyclerView 
    android:padding="4dp" 
    android:clipToPadding="false" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

देखें कि पैडिंग ऊपर और नीचे सहित सभी तरफ 4 डीपी जोड़ देगा। फिर क्लिप टॉपिंग पैरामीटर सुनिश्चित करता है कि आपके बच्चे के सामान काटा नहीं जा रहा है। अब, 4dp अपने बच्चों के सामान के लिए सभी तरफ पैडिंग जोड़ें, और आप जाने के लिए अच्छे हैं। कुल मिलाकर आप पक्षों और वस्तुओं के बीच 8 डीपी पैडिंग प्राप्त करते हैं।

+0

हाँ, मैं आमतौर पर इसे कैसे करता हूं, लेकिन मैं अपने रीसाइक्लिंग व्यू में हेडर शामिल हैं और प्रत्येक शीर्षलेख के अपने बच्चे हैं, इसलिए मुझे इसे प्रत्येक की आखिरी और पहली पंक्ति में प्रोग्रामेटिक रूप से सेट करने की आवश्यकता है हेडर केवल – RedEagle

+0

सुनिश्चित नहीं है कि मैं समझता हूं। यह RecyclerView के अंदर हेडर से कैसे संबंधित है? क्या आप चाहते हैं कि हेडर के पास कोई पैडिंग न हो? यहां तक ​​कि अगर ऐसा है, तो आप एक ही समाधान का उपयोग करके बाएं और दाएं पैडिंग से छुटकारा पा सकते हैं। –

+0

मेरे पास हेडर हैं और प्रत्येक शीर्षलेख में बच्चों की गैर-विशिष्ट गणना है इसलिए मैं प्रत्येक शीर्षलेख के अंतिम बच्चे पर शीर्ष पैडिंग/मार्जिन और पहला बच्चा और नीचे पैडिंग/मार्जिन जोड़ना चाहता हूं। – RedEagle

0

किसी कारण से पुराने clipToPadding=false समाधान मेरे लिए काम नहीं कर रहा है। तो मैं एक ItemDecoration

https://gist.github.com/kassim/582888fa5960791264fc92bc41fb6bcf

public class BottomPaddingDecoration extends RecyclerView.ItemDecoration { 
    private final int bottomPadding; 

    public BottomPaddingDecoration(int bottomPadding) { 
     this.bottomPadding = bottomPadding; 
    } 

    @Override 
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { 
     int position = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition(); 
     if (position == parent.getAdapter().getItemCount() - 1) { 
      outRect.set(0, 0, 0, bottomPadding); 
     } 
    } 
} 
-1

clipToPadding सुझाव मेरे लिए काम नहीं किया जोड़ा है, लेकिन मैंने पाया कि एक NestedScrollView का उपयोग कर एक बहुत ही सुविधाजनक समाधान है। बस RecyclerView पर स्क्रॉलिंग अक्षम करें, इसे नीचे कुछ पैडिंग के साथ लेआउट में रखें, और NestedScrollView में लेआउट डालें।

कुछ इस तरह:

<NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:paddingBottom="10dp"> 
     <RecyclerView 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:nestedScrollingEnabled="false" /> <!-- Don't miss this --> 
    </LinearLayout> 
</NestedScrollView> 
संबंधित मुद्दे