ป้องกันไม่ให้ ViewPager ทำลายมุมมองนอกหน้าจอ


134

ฉันมี ViewPager ที่เชื่อมต่อกับ FragmentPagerAdapter ที่แสดงสามส่วน ViewPager ดูเหมือนจะทำลายมุมมองของแฟรกเมนต์ที่โฮสต์เมื่อมีการปัดออกจากตำแหน่งปัจจุบันมากกว่าหนึ่งครั้ง

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

นอกจากนี้ยังไม่โหลดส่วนที่สามจนกว่าการปัดครั้งแรกจะเกิดขึ้นซึ่งเป็นปัญหาเนื่องจากแต่ละส่วนจัดการการเรียกใช้บริการของตัวเองและฉันต้องการให้ทั้งสามเริ่มการทำงานพร้อมกันเมื่อกิจกรรมโหลดขึ้น การเรียกใช้บริการครั้งที่สามล่าช้าน้อยกว่าอุดมคติ

มีวิธีใดบ้างที่จะโน้มน้าวให้ ViewPager หยุดพฤติกรรมนี้และเก็บชิ้นส่วนทั้งหมดของฉันไว้ในความทรงจำ

คำตอบ:


335

ในการแก้ไข 4ของ Support Package มีการเพิ่มเมธอดลงใน ViewPager ซึ่งช่วยให้คุณสามารถระบุจำนวนเพจนอกหน้าจอที่จะใช้แทนที่จะเป็นค่าดีฟอลต์ซึ่งก็คือ 1

ในกรณีของคุณคุณต้องการระบุ 2 เพื่อที่ว่าเมื่อคุณอยู่ในหน้าที่สามหน้าแรกจะไม่ถูกทำลายและในทางกลับกัน

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

มีความคิดอย่างไรที่จะทำสิ่งนี้ในขั้นตอนการปกปิด?
josephus

4
สวัสดี. ในสิ่งที่ฉันกำลังทำแฟรกเมนต์ / เพจจะถูกสร้างขึ้นแบบไดนามิกดังนั้นจึงมีแฟรกเมนต์ที่น่าจะเป็นจำนวนไม่ จำกัด กรณีนี้มักจะไปที่ 10 หรือน้อยกว่า การใช้หน่วยความจำจะใช้วิธีแก้ปัญหานี้กับเพจจำนวนมากได้หรือไม่? ชิ้นส่วนจะเก็บเฉพาะมุมมองข้างทาง ขอบคุณ!
mahkie

วิธีนี้พ่น: "java.lang.IllegalStateException: Fragment ได้เพิ่มแล้ว:" ข้อผิดพลาดสำหรับแอปของฉัน
alicanbatur

ขอบคุณมาก. มันได้ผลจริงๆ ฉันก็มีปัญหาเหมือนกันเช่น @chefgon
Prashant

@mahie วิธีแก้ปัญหาข้างต้นหากสำหรับสิ่งนี้ถูกนำเสนอเป็นการเพิ่มประสิทธิภาพ หากคุณทราบล่วงหน้าจำนวน * ของเพจคุณจะต้องสนับสนุนหรือมีกลไกการโหลดแบบขี้เกียจ * บนหน้าเว็บของคุณการปรับแต่งการตั้งค่านี้อาจมีประโยชน์ในการรับรู้ความราบรื่น * ของภาพเคลื่อนไหวและการโต้ตอบของเพจ หากคุณมีเพจจำนวนน้อย (3-4) * ที่คุณสามารถใช้งานได้พร้อมกันทั้งหมดจะใช้เวลาน้อยลงในเลย์เอาต์สำหรับ * มุมมองที่สร้างขึ้นใหม่เป็นหน้าผู้ใช้ไปมา
Asthme

8

ตามค่าเริ่มต้น ViewPager จะสร้างชิ้นส่วนขึ้นใหม่เมื่อคุณปัดหน้า เพื่อป้องกันปัญหานี้คุณสามารถลองทำอย่างใดอย่างหนึ่งจากสองสิ่ง:

1.ใน onCreate () ของแฟรกเมนต์ของคุณให้เรียก setRetainInstance (true)

2.หากจำนวนชิ้นส่วนได้รับการแก้ไขและค่อนข้างเล็กจากนั้นใน onCreate () ของคุณให้เพิ่มรหัสต่อไปนี้:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

ถ้าจำไม่ผิดตัวเลือกที่สองมีแนวโน้มดีกว่า แต่ฉันขอให้คุณลองทั้งสองอย่างและดูว่าอันไหนได้ผล


3

"กำหนดจำนวนหน้าที่ควรเก็บไว้ที่ด้านใดด้านหนึ่งของเพจปัจจุบันในลำดับชั้นมุมมองในสถานะว่างเพจที่เกินขีด จำกัด นี้จะถูกสร้างใหม่จากอะแด็ปเตอร์เมื่อจำเป็น"

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

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