Android में शीर्ष ListView आइटम (और अंतिम से नीचे) के ऊपर मार्जिन जोड़ें


147

यह एंड्रॉइड में एक सूची दृश्य में आइटमों के लेआउट के बारे में एक बहुत अच्छा सवाल है।

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

मैंने स्वयं सूची दृश्य में पैडिंग जोड़ने की कोशिश की है, लेकिन तब जब आप सूची को स्क्रॉल करते हैं तो यह पैडिंग के किनारे के नीचे गायब हो जाता है।

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


बस बाएं और दाएं मार्जिन को निर्दिष्ट करें ... अपने xml को यहां पेस्ट करने का प्रयास करें, इसलिए मैं समस्या को संपादित कर सकता हूं: प्रतीक्षा करें, आपका मतलब है .... आप चाहते हैं कि ऊपर और नीचे की गद्दी भी स्क्रॉल हो गई?
टेक यिन

मैं बाएं और दाएं मार्जिन को निर्दिष्ट नहीं कर सकता - केवल लेआउट में Android लेआउट में कोई 'मार्जिन' नहीं है। लेकिन, हां, मैं चाहता हूं कि ऊपर और नीचे की पैडिंग स्क्रॉल हो जाए - यह वर्णन करने का एक अच्छा तरीका है।
मिक बायरन

मैंने पहले से ही कई विधि की कोशिश की, और फिर भी असफल रहा .. मेरे पास करने के लिए कुछ चालें हैं, लेकिन यह करना अधिक कठिन होगा ... आपने पहले और अंतिम स्थान पर सूची आइटम पर 2 कस्टम ऑब्जेक्ट डाल दिए .. और कस्टम एडाप्टर का उपयोग करें आइटम का पता लगाएं और इसे अलग तरह से खींचें (संकीर्ण ऊंचाई और पारदर्शी)
टेक यिन

बेनाम: हाँ ... बेनाम: कि क्या मैं के रूप में अच्छी तरह से वापस गिरने के लिए सोच रहा है। लेकिन उस के साथ सभी तरह की जटिलताएं हैं, जैसा कि तब मुझे सूची आइटम में पृष्ठभूमि रंग सेट करने की आवश्यकता होगी, न कि दृश्य, जिसका मतलब है कि मुझे तब चीजों को मैन्युअल रूप से हैक करने की आवश्यकता होगी जब आपने चीजों को टैप किया हो। । वैसे भी आपकी मदद के लिए धन्यवाद ...
मिक बेरेन

अच्छी खबर .. मुझे समाधान मिल गया ... आप ListActivity पर addHeaderView (देखें v) का उपयोग कर सकते हैं .. बस कॉल करें getListView(). addHeaderView(capView)और getListView(). addHeaderView(botView) सुनिश्चित करें कि सूची की सामग्री को इनिशियलाइज़ करने से पहले इसे कॉल किया जाता है जैसे। setListAdapter (अनुकूलक);
टेक यिन

जवाबों:


397

आप ने लिखा:

मैंने स्वयं सूची दृश्य में पैडिंग जोड़ने की कोशिश की है, लेकिन तब जब आप सूची को स्क्रॉल करते हैं तो यह पैडिंग के किनारे के नीचे गायब हो जाता है।

ListView's clipToPaddingकरने के लिए विशेषता सेट करें false। यह लेआउट के अंत में स्क्रॉल करने ListView और स्क्रॉल करने में सक्षम होगा (और न केवल पैडिंग के किनारे तक)।

एक उदाहरण:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPaddingएक XML विशेषता है ViewGroup, लेआउट और दृश्य कंटेनरों के लिए बेस क्लास।

संबंधित विधि कॉल है:

public void setClipToPadding (boolean clipToPadding)

4
इसके अतिरिक्त, यह एक शैली या विषय के माध्यम से बनाया जा सकता है<item name="android:clipToPadding">false</item>
pjco


4
चर्चा में थोड़ी देर हो गई, लेकिन ध्यान दें कि पुराने उपकरणों पर (मैंने इसे कुछ 2.3.x उपकरणों पर देखा है), सूची आइटम दृश्य बहुत जल्द पुनर्नवीनीकरण हो जाते हैं। जबकि ड्राइंग चरण जानता है कि यह वहां आकर्षित हो सकता है, लेआउट चरण नहीं है, इसलिए यह सोचता है कि आइटम पहले से ही ऑफ स्क्रीन है। Stackoverflow.com/questions/15915226/… देखें ।
जेफरी क्लार्डी

@JeffreyKlardie मैं समस्या का सामना करता हूं जहां आइटम पुराने डिवाइस पर बहुत जल्द पुनर्नवीनीकरण हो जाते हैं और यह स्क्रॉलबार को खुद को मक्खी पर आकार देता है, जो वास्तव में अजीब लगता है। @pjco मुझे यकीन नहीं है कि क्यों लेकिन clipToPaddingएक शैली के माध्यम से स्थापित करना मेरे लिए काम नहीं करता है, यह ऐसा है जैसे यह लागू नहीं होता है। हालांकि, अगर मैं इसे सीधे ListView पर सेट करता हूं तो यह काम करता है।
ForceMagic

5
android:scrollbarStyle="outsideOverlay"इतना मत भूलो कि स्क्रॉल बार सभी तरह से पैडिंग के माध्यम से जाता है
jfcartier

19
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

उपरोक्त ListView में 20 पिक्सेल का हेडर और फ़ुटर पैडिंग होगा।


4
जवाब के लिए धन्यवाद! बहुत अच्छा काम करता है!! यदि आप dp में ऊँचाई डालना चाहते हैं तो DisplayMetrics का उपयोग करके किया जा सकता है: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
टोनी Ceralva

3
या अभी भी बेहतर है, getResources ()। GetDimensionPixelOffset (R.dimen.some_value) का उपयोग करके जावा स्तर पर डीपी में डिमेंस प्राप्त करें;
greg7gkb

1
सच में मैं Android साइट पर उन लोगों के खिलाफ
स्टैकऑवरफ्लो

1
या इससे भी बेहतर(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
यूजेन पिसेंक सेप

1
API 23 में View के लिए कोई विधि "setHeight ()" नहीं है। इसके बजाय हम "setMimumimumeeight ()" का उपयोग कर सकते हैं।
KWA

10

@ जकोबड के उत्तर के लिए उपांग ...

मेरी सूची दृश्य पहले से ही सूची android:divider/android:dividerHeightदृश्य वस्तुओं के बीच पारदर्शी अंतराल बनाने के लिए गुणों का उपयोग कर रही थी । यह मैं बस को जोड़ने की अनुमति android:headerDividersEnabledऔर android:footerDividersEnabledगुण और हैडर और फुटर विचारों सेटnew View(Activity.this)

उन मामलों के लिए थोड़ा सरलीकरण करें जहां आपके पास पहले से ही सूची दृश्य में डिवाइडर सेटअप है।


1
मैं किसी को भी सलाह दूंगा कि आइटम मार्जिन और पेडिंग के बजाय डिवाइडर का उपयोग करना कहां संभव है। शानदार उत्तर
dzsonni

2

ListFragment@Jakobud और @ greg7gkb द्वारा समाधानों के आधार पर मेरे समाधान का उपयोग करना।

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);

1

@ गुन्नार कार्ल्ससन का जवाब अच्छा है, लेकिन सेल के विचारों का समय से पहले पूरी तरह से पुनर्नवीनीकरण किया जा रहा है जब पूरी तरह से पैडिंग के पीछे है, लेकिन अभी तक पूरी तरह से स्क्रीन बंद नहीं है। ClipToPadding सेट करना = गलत इसके लिए ज़िम्मेदार है और Android के भविष्य के संस्करण में इसे ठीक किया जा सकता है या नहीं भी हो सकता है। ( जब सूची में क्लिपटैडिंग का उपयोग किया जाता है तो आइटम समय से पहले पुनर्नवीनीकरण हो जाते हैं )

मैं कोई साइड इफेक्ट के साथ एक अच्छा सरल समाधान है:

  1. अपने cell_design.xml में एक बाहरी (रैखिक या सापेक्ष) लेआउट जोड़ें
  2. इस बाहरी लेआउट में पूरे सेल के चारों ओर एक "मार्जिन" बनाने के लिए पैडिंग (यानी 10dip) जोड़ें। (एनबी केवल पैडिंग काम करेगा, बाहरी लेआउट पर मार्जिन नहीं)
  3. ListView सेट पर android:dividerHeight="-10dip", सेल के आस-पास के विपरीत

अन्य उत्तर की तुलना में, विभक्त रंग सेट करने की कोई आवश्यकता नहीं है। सबसे ऊपरी और बॉटलमॉस्ट कोशिकाओं में पैडिंग मौजूद होगी, और नकारात्मक विभक्त बीच में डबल ऊंचाई के डिवाइडर को रोक देगा।


"कोई साइड इफेक्ट के साथ" यह पूरी तरह सच नहीं है। अपने दृश्य पदानुक्रम में एक और परत जोड़ना, विशेष रूप से एक सूची आइटम में, प्रदर्शन को नीचा दिखाने का मतलब है।
तेवोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.