วาด TableViewer ใหม่ช้าๆ เมื่อเปลี่ยนวัตถุอินพุต

ในโครงการของฉัน ฉันมี TableViewer ซึ่งแสดงข้อมูลประมาณ 1,000 แถวจากฐานข้อมูล ContentProvider คือ ArrayContentProvider

เมื่อฉันเปลี่ยนอินพุตรายการ (setInput() บนออบเจ็กต์ TableViewer) เป็นอีกอันหนึ่งที่มีปริมาณข้อมูลเท่ากัน ทุกอย่างก็โอเค แต่เมื่อฉันต้องการอัปเดตด้วย List<T> ด้วยขนาดที่ต่างจากขนาดก่อนหน้า แอปพลิเคชันจะค้างประมาณ 10 เท่าของเวลาที่เปลี่ยนแปลงด้วยปริมาณข้อมูลเท่าเดิม

รายการแรกมีขนาด 1k และรายการที่สองมีขนาดประมาณ 960 การดำเนินการค้างโดยตรงบนเมธอด setInput()

ไม่มีใครรู้ว่าทำไมสิ่งนี้ถึงเกิดขึ้น?


person Zayl    schedule 17.10.2012    source แหล่งที่มา
comment
TableViewer ทำสิ่งต่างๆ มากมายในเมธอด setInput; รับองค์ประกอบเป็นอาร์เรย์ การเรียงลำดับ การกรอง การเปรียบเทียบกับรายการเก่า ฯลฯ ... ฉันอาจจะตรวจสอบวิธี toArray ในการใช้งานรายการใดก็ตามที่คุณมีก่อน เนื่องจากจะง่ายต่อการเปรียบเทียบ/กำจัด   -  person Nick Wilson    schedule 17.10.2012


คำตอบ (1)


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

โปรดดูที่ http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet029VirtualTableViewer.java สำหรับตัวอย่าง

person Ralf M Petter    schedule 06.11.2012
comment
ขอบคุณสำหรับการเล่นซ้ำ น่าเสียดายที่ฉันใช้สไตล์นี้กับ TableViewer แล้ว แต่ก็ไม่ได้ช่วยอะไร สิ่งที่น่าสนใจคือเมื่อเปลี่ยนเป็นขนาดที่เล็กลง ตารางจะโหลดได้อย่างถูกต้อง แต่เมื่อถึงเวลานั้น ฉันต้องการโหลดรายการที่ใหญ่กว่า มันก็จะวางสาย - person Zayl; 06.11.2012
comment
คุณควรใช้ตัวสร้างโปรไฟล์เพื่อวิเคราะห์ปัญหา ตัวสร้างโปรไฟล์จะแสดงให้คุณเห็นว่าโค้ดของคุณทำอะไรในขณะที่ค้าง - person Ralf M Petter; 07.11.2012