ภาพเคลื่อนไหวแบบคาดการณ์ของ RecyclerView ไม่ทำงานด้วย setHasStableIds และแจ้งเตือน DatasetChanged

ฉันกำลังใช้ setHasStableIds ในอะแดปเตอร์และเรียก notifyDatasetChanged ทั้งหมดแทน notifyItemXYZ ด้วยเหตุผลหลายประการ ฉันได้รับแอนิเมชั่นธรรมดาตั้งแต่ setHasStableIds(true) แต่เมื่อลบรายการออก รายการนอกหน้าจอที่ควรเลื่อนในหน้าจอตอนนี้ก็ค่อยๆ หายไป (เหมือนกับกรณีที่ปิดภาพเคลื่อนไหวแบบคาดเดาใน Chet Haase talk https://youtu.be/imsr8NrIAMs) เมื่อฉันใช้ notifyItemRemoved มันใช้งานได้ (แต่รหัสอื่นของฉันก็ไม่สะดวกมาก)

TLDR; มีวิธีรับภาพเคลื่อนไหวที่คาดเดาได้ (ไม่เพียงแต่ง่าย ๆ ) เมื่อใช้ setHasStableIds & notifyDatasetChanged ด้วย RecyclerView หรือไม่ (นอกเหนือจากการใช้ notifyItemRemoved)


person urSus    schedule 08.11.2016    source แหล่งที่มา


คำตอบ (1)


ถามเมื่อไม่กี่ปีก่อน แต่อาจจะมีประโยชน์สำหรับคนที่ค้นหาวิธีการทำเช่นนี้

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

rv.setLayoutManager(new LinearLayoutManager(rv.getContext()) {
        @Override
        protected int getExtraLayoutSpace(RecyclerView.State state) {
            return Math.max(averageItemSizePx, super.getExtraLayoutSpace(state));
        }
});

แน่นอนว่ามันมีค่าใช้จ่ายด้านประสิทธิภาพ ดังนั้นควรระมัดระวัง

แต่บางครั้งวิธีการนี้จะทำให้คุณมีภาพเคลื่อนไหวที่ไม่สามารถคาดเดาได้ - ขึ้นอยู่กับทิศทางการเลื่อนครั้งสุดท้าย (จากแหล่งข้อมูล LinearLayoutManager)

person j2esu    schedule 19.11.2018