เพิ่มระยะขอบด้านบนรายการมุมมองด้านบน (และด้านล่างสุดท้าย) ใน Android


147

นี่เป็นคำถามที่ค่อนข้างดีเกี่ยวกับเลย์เอาต์ของรายการใน ListView ใน Android

ฉันมีกิจกรรมที่มีแถบชื่อเรื่องที่ด้านบนและ ListView ทำให้ส่วนที่เหลือของหน้าจอ ฉันต้องการให้ ListView ของฉันปรากฏพร้อมกับการขยาย 10dp ที่ด้านซ้ายขวาและบนสุด แต่เมื่อคุณเลื่อน ListView ขึ้นไปฉันต้องการให้มันครอบคลุมการขยาย 10dp ด้านบนก่อนที่จะหายไปภายใต้ขอบจาง ๆ ในทำนองเดียวกันเมื่อคุณเลื่อนไปที่ด้านล่างรายการสุดท้ายควรปรากฏพร้อม 10dp ระหว่างด้านล่างของรายการสุดท้ายและด้านล่างของหน้าจอจริง (ถ้าคุณสงสัยว่าทำไมเพราะเป็นภาพพื้นหลังสวยที่ฉันต้องการ โผล่ออกมารอบ ๆ ListView)

ฉันได้ลองเพิ่มการเติมเข้าไปใน ListView ด้วยตัวเองแล้ว แต่เมื่อคุณเลื่อนรายการมันจะหายไปใต้ขอบของการเติม

ฉันมาจากพื้นหลังการพัฒนาเว็บและการเปรียบเทียบจะเป็นการเพิ่มระยะขอบเหนือรายการในรายการแรก (และด้านล่างของรายการสุดท้าย)


ระบุระยะขอบซ้ายและขวา ... ลองวาง xml ของคุณที่นี่เพื่อให้ฉันเห็นการแก้ไขปัญหา: เดี๋ยวก่อนคุณหมายถึง .... คุณต้องการให้ช่องว่างด้านบนและด้านล่างเลื่อนเกินไปหรือไม่
Tek Yin

ฉันไม่สามารถระบุระยะขอบซ้ายและขวา - ไม่มี 'ระยะขอบ' ในการจัดวางแบบ Android มีช่องว่างภายในเท่านั้น แต่ใช่ฉันต้องการให้ช่องว่างด้านบนและด้านล่างเลื่อน - นั่นเป็นวิธีที่ดีในการอธิบาย
มิก Byrne

ฉันลองใช้วิธีการหลายวิธีแล้วและยังล้มเหลว .. ฉันมีลูกเล่นบางอย่างที่ต้องทำ แต่มันจะยากกว่าที่จะทำ ... แม้ว่าคุณจะวางวัตถุที่กำหนดเอง 2 รายการในตำแหน่งแรกและตำแหน่งสุดท้าย .. ตรวจจับรายการและวาดมันแตกต่างกัน (ความสูงแคบ & โปร่งใส)
เทคหยิน

ใช่ ... นั่นคือสิ่งที่ฉันคิดที่จะถอยกลับเช่นกัน แต่มีหลายสิ่งที่ทำให้เกิดความยุ่งยากเพราะฉันจะต้องตั้งค่าสีพื้นหลังในรายการไม่ใช่มุมมองซึ่งหมายความว่าฉันจะต้องแฮ็คด้วยตนเองในลักษณะพิเศษบางอย่างเพื่อแสดงเมื่อคุณเคาะสิ่งต่าง ๆ . ขอบคุณสำหรับความช่วยเหลือของคุณ ...
มิกเบิร์น

ข่าวดี .. ฉันได้รับการแก้ไข ... คุณสามารถใช้ addHeaderView (ดู v) ใน ListActivity .. เพียงแค่โทรหา getListView(). addHeaderView(capView)และ getListView(). addHeaderView(botView) ตรวจสอบให้แน่ใจว่ามันถูกเรียกก่อนเริ่มต้นเนื้อหาของรายการเช่น setListAdapter (อะแดปเตอร์);
Tek Yin

คำตอบ:


397

คุณเขียน:

ฉันได้ลองเพิ่มการเติมเข้าไปใน ListView ด้วยตัวเองแล้ว แต่เมื่อคุณเลื่อนรายการมันจะหายไปใต้ขอบของการเติม

ชุดแอตทริบิวต์ListView's clipToPadding falseสิ่งนี้จะเปิดใช้งานการ padding รอบ ๆ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

2
โอ้นี่ใช้ได้กับ ScrollView ด้วยเช่นกัน
pjco

4
สายไปยังการสนทนา แต่โปรดทราบว่าในอุปกรณ์รุ่นเก่า (ฉันเห็นมันบนอุปกรณ์ 2.3.x บางรายการ) มุมมองรายการจะได้รับการรีไซเคิลเร็วเกินไป ในขณะที่เฟสการวาดรู้ว่าสามารถวาดได้ที่นั่นเฟสเลย์เอาต์ไม่ได้ดังนั้นจึงคิดว่ารายการอยู่นอกหน้าจอแล้ว ดูstackoverflow.com/questions/15915226/… .
Jeffrey Klardie

@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);
Tony Ceralva

3
หรือดีกว่านั้นให้ลดขนาดเป็น dp ที่ระดับ Java โดยใช้ getResources (). getDimensionPixelOffset (R.dimen.some_value);
greg7gkb

1
ประหลาดใจอย่างแท้จริงกับจำนวน Android ที่ฉันเรียนรู้จาก StackOverflow กับสิ่งที่ฉันได้เรียนรู้ในเว็บไซต์นักพัฒนา
TrueCoke

1
หรือดียิ่งขึ้น(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec

1
ไม่มีวิธี "setHeight ()" สำหรับ View ใน API 23 แต่เราสามารถใช้ "setMinimumHeight ()" แทนได้
KWA

10

ต่อท้ายคำตอบของ @ Jakobud ...

listView ของฉันใช้ประโยชน์จากandroid:divider/android:dividerHeightคุณสมบัติเพื่อสร้างช่องว่างแบบโปร่งใสระหว่าง listView รายการแล้ว สิ่งนี้ทำให้ฉันสามารถเพิ่มandroid:headerDividersEnabledและandroid:footerDividersEnabledคุณสมบัติและตั้งค่ามุมมองส่วนหัวและส่วนท้ายเป็นnew View(Activity.this)คุณสมบัติและการตั้งค่าส่วนหัวและท้ายวิว

ทำให้เข้าใจง่ายเล็กน้อยสำหรับกรณีที่คุณตั้งค่าตัวแบ่งไว้ใน listView แล้ว


1
ฉันจะแนะนำให้ทุกคนที่เป็นไปได้ที่จะใช้วงเวียนแทนในระยะขอบของสินค้าและช่องว่างภายใน คำตอบที่ดี
dzsonni

2

โซลูชันของฉันใช้ a 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

@Gunnar Karlsson คำตอบนั้นดี แต่มีปัญหาเกี่ยวกับมุมมองของเซลล์ที่ถูกนำกลับมาใช้ใหม่ก่อนกำหนดเมื่ออยู่หลังช่องว่างภายใน แต่ยังไม่ปิดหน้าจอทั้งหมด การตั้งค่า clipToPadding = false เป็นผู้รับผิดชอบในเรื่องนี้และอาจจะหรือไม่ได้รับการแก้ไขใน Android รุ่นอนาคต ( เมื่อใช้ ClipToPadding ใน ListView รายการต่างๆจะถูกรีไซเคิลก่อนกำหนด )

ฉันมีวิธีแก้ปัญหาง่ายๆที่ดีโดยไม่มีผลข้างเคียง:

  1. เพิ่มเค้าโครงด้านนอก (เชิงเส้นหรือเชิงสัมพันธ์) ลงใน cell_design.xml ของคุณ
  2. ในเค้าโครงด้านนอกนี้เพิ่มการขยาย (เช่น 10dip) เพื่อสร้าง "ระยะขอบ" รอบเซลล์ทั้งหมด (NB padding เท่านั้นจะใช้งานได้ไม่ใช่ระยะขอบบนรูปแบบด้านนอก)
  3. ในชุด ListView android:dividerHeight="-10dip"ตรงข้ามกับสิ่งที่อยู่รอบ ๆ เซลล์

เมื่อเทียบกับคำตอบอื่น ๆ ไม่จำเป็นต้องตั้งค่าตัวแบ่งสี ช่องว่างภายในเซลล์ด้านบนสุดและด้านล่างสุดจะมีอยู่และตัวแบ่งเชิงลบจะป้องกันการแบ่งความสูงสองเท่าในระหว่างนั้น


"ไม่มีผลข้างเคียง" นั่นไม่จริงทั้งหมด การเพิ่มเลเยอร์อื่นในลำดับชั้นการดูของคุณโดยเฉพาะอย่างยิ่งในรายการ listview หมายถึงการลดระดับการแสดง
Teovald
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.