पिछले बच्चे में पुनर्नवीनीकरण में मार्जिन / पैडिंग


126

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

मेरे पुनर्नवीनीकरण अनुकूलक में मेरे पास हेडर और चिल्ड हैं, इसलिए मैं इसका उपयोग नहीं कर सकता

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

मुझे प्रत्येक हेडर की अंतिम पहली पंक्ति पर इसे व्यक्तिगत रूप से उपयोग करने की आवश्यकता है


इस तरह का उपयोग करें: <android.support.v7.widget.RecyclerView android: id = "@ id / सूची" android: paddingBottom = "5dp" Android: Layout_width = "match_parent" Android: Layout_height = "wra_content" />
पंकज अरोरा

आप onBindViewHolder में पैडिंग और मार्जिन बदल सकते हैं और फिर setIsRecyclable (झूठा) को देखने वाले पर कॉल कर सकते हैं
user3425867

जवाबों:


9

मैं कोटलिन में इसका उपयोग करता हूं

override fun onBindViewHolder(holder: RecyclerView.ViewHolder(view), position: Int) {
    if (position == itemsList.lastIndex){
        val params = holder.itemView.layoutParams as FrameLayout.LayoutParams
        params.bottomMargin = 100
        holder.itemView.layoutParams = params
    }else{
        val params = holder.itemView.layoutParams as RecyclerView.LayoutParams
        params.bottomMargin = 0
        holder.itemView.layoutParams = params
    }
  //other codes ...
}

232

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

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

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


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

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

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

एकमात्र विचार जो मैंने अपने हेडर के लेआउट में शीर्ष और नीचे का मार्जिन सेट किया था, लेकिन मैं सोच रहा था कि क्या इसे
हासिल

उस स्थिति में, आप अपने पिछले बच्चे के बाद RecyclerView में बस एक नकली आइटम जोड़ सकते हैं। यह सबसे आसान है, अगर यह हासिल करने का सबसे अच्छा तरीका नहीं है। :)
सुबिन सेबेस्टियन

82

ऊपर और नीचे दोनों मदों में पैडिंग जोड़ने के बजाय, आप बस अपने पुनर्नवीकरण दृश्य के ऊपर और नीचे पैडिंग जोड़ सकते हैं और clipToPaddingविशेषता सेट कर सकते हैं 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" />

यह आसान उपाय है, लेकिन मेरे
पुनर्नवीनीकरण दृश्य

@RedEagle कोशिश करें और देखें कि क्या आपको वांछित प्रभाव मिलता है, लेकिन मुझे यकीन है कि यह काम करता है।
कोलिन्स एबिटेकाइजा

1
यह समाधान आइटम सजावट एक से बेहतर है। जब मैं ListAdapter का उपयोग कर रहा हूं और एक अलग सूची प्रस्तुत कर रहा हूं, यदि पिछली सूची के अंतिम आइटम ने अपनी स्थिति नहीं बदली है, लेकिन इसके बाद नए आइटम जोड़े गए हैं, तो पूर्व इसकी निचली गद्दी को बनाए रखेगा भले ही यह सूची में अंतिम आइटम न हो अधिक।
एना कोरिद्ज़े

38

उपयोग ItemDecoration:

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) {
        int position = parent.getChildAdapterPosition(view);
        boolean isLast = position == state.getItemCount()-1;
        if(isLast){
            outRect.bottom = space;
            outRect.top = 0; //don't forget about recycling...
        }
        if(position == 0){
            outRect.top = space;
            // don't recycle bottom if first item is also last
            // should keep bottom padding set above
            if(!isLast)
                outRect.bottom = 0;
        }
    }
}

तथा

//8dp as px
int space = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8,
            getResources().getDisplayMetrics()); // calculated
//int space = getResources().getDimensionPixelSize(
//    R.dimen.list_item_padding_vertical); // from resources
recyclerView.addItemDecoration(new SpacesItemDecoration(space));

1
अरे, ऐसा लगता नहीं है कि RecyclerView.ememecoration को संसाधन वर्ग किसी भी अधिक मिलता है, मैंने इसे बस कंस्ट्रक्टर में एक तर्क के रूप में जोड़ा।
कृतको

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

2
इस उत्तर को उखाड़ा जाना चाहिए! हालांकि सबिन सेबेस्टियन का जवाब अच्छा काम कर रहा है, हालांकि, आइटमडीक्यूलेशन स्पेस के बराबर नहीं हैं।
इरोइयो

1
लेकिन आइटम निकालने के बाद सभी आइटमों के लिए ऑफ़सेट को फिर से नहीं बनाया जाएगा
user924

सच हो सकता है, के रूप में notifyItemInserted/ Removedकेवल एक आइटम आकर्षित करेगा / आइटम को हटा देगा और साफ कर देगा कि यह Viewअन्य सभी बच्चों को अछूता छोड़ रहा है। उदाहरण के लिए, जब कुछ आइटम पहले सूची में है (शीर्ष गद्दी के साथ खींचा गया है) और हम शीर्ष में एक नया जोड़ रहे हैं, तो पहले-पहले-वर्तमान में दूसरा आइटम अभी भी शीर्ष पर गढ़ा जाएगा ... आसान फिक्स कॉल करना है notifyDataSetChanged(बल redraw) सभी ...), उस चीज़ को पहचानने के लिए और अधिक जटिल कुछ तर्क की आवश्यकता है, जो पहले और / या अंतिम स्थान पर था, स्थानांतरित किया गया और फिर कॉल किया गयाnotifyItemChanged(newPositionOfOldFirstAndOrLastItem)
स्नैचम

28
<android.support.v7.widget.RecyclerView
    android:id="@+id/rv_tpf"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clipToPadding="false"
    android:paddingBottom="100dp" />

जोड़ें android:clipToPadding="false"और android:paddingBottom="100dp"अपने recyclerview में।


2
बहुत बढ़िया! यह एकदम सही है
केविनबी

16

Android जोड़ें: clipToPadding = "false" और android: paddingBottom = "65dp" अपने रिसाइकिलव्यू में। यदि आप रीसायकल व्यू सेल पर फैब मेनू बटन और क्रियाओं का उपयोग कर रहे हैं।

<androidx.recyclerview.widget.RecyclerView
      android:id="@+id/dinner_recycler_view"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:clipToPadding="false"
      android:paddingBottom="65dp"/>

3

किसी कारण के लिए पुराने 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

मैंने बेहतर के लिए अद्भुत जवाब @snachmsm उत्तर को संशोधित किया है और आपको सही तरीके से उपयोग करने का विचार दिया है

public class SpacesItemDecoration extends DividerItemDecoration {
    private int space;

    public SpacesItemDecoration(Context clContext,int oriantation,int space) {
        super(clContext,oriantation);
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect,view,parent,state);
        int position = parent.getChildAdapterPosition(view);
        boolean isLast = position == state.getItemCount()-1;
        if(isLast){
            outRect.bottom = space;
            outRect.top = 0; //don't forget about recycling...
        }
       /* if(position == 0){
            outRect.top = space;
            // don't recycle bottom if first item is also last
            // should keep bottom padding set above
            if(!isLast)
                outRect.bottom = 0;
        }*/
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.