java - जब डेटा में परिवर्तन होता है तो गतिविधि के संक्रमण



android animation (1)

मुझे छवि एडाप्टर मिला है जहां प्रत्येक आइटम उपयोगकर्ता छवि है, जब यह चयनित उपयोगकर्ता छवि के साथ एक नई गतिविधि खोलता है, तो मैं छवि को साझा तत्व के रूप में चिह्नित करता हूं और गतिविधि बदलावों का उपयोग करता हूं।

उन क्रियाओं का एक हिस्सा जो मैं दूसरी गतिविधि पर करता हूं, सभी उपयोगकर्ताओं को प्रभावित करता है, इसलिए एडेप्टर कॉल को notifyDataSetChanged करता notifyDataSetChanged और स्थिति को सूची के शीर्ष पर रीसेट करता है।

जब यह ऐसा होता है तो वापसी एनीमेशन में गड़बड़ी होती है, जब मैं दूसरी गतिविधि को बंद कर देता हूं और सूची में वापस लौटा देता हूं तो डेटा को बदल दिया गया है ताकि छवि को गलत सेल में एनिमेट किया जा सके।

मुझे दो प्रश्न हैं:

  1. सही सेल में एनीमेशन को रिमैप करने के लिए मैं क्या कर सकता हूं? सभी कोशिकाओं को एक ही साझा आईडी मिल गया ...
  2. यदि मेरा उपयोगकर्ता अब सूची पर दिखाई नहीं दे रहा है, तो मैं अलग ऐनिमेशन के साथ रिटर्न एनीमेशन कैसे बदल सकता हूं?

सही सेल में एनीमेशन को रिमैप करने के लिए मैं क्या कर सकता हूं? सभी कोशिकाओं को समान साझा आईडी मिला।

पहली गतिविधि में आपको कुछ चाबी मिलनी चाहिए जो कि दूसरी गतिविधि को लॉन्च करने वाली वस्तु को निर्दिष्ट करती है। मान लीजिए कि आपके पास अद्वितीय User userId और User Map<Integer, User> , यानी Map<Integer, User>

  1. जब आप दूसरी गतिविधि पेश करते हैं तो मैप में यह User की कुंजी गुजरती हैं, मान लें कि यह 42 (नक्शे में 42 -> John Doe , और आप John Doe लिए दूसरी गतिविधि शुरू कर रहे हैं)।
  2. setExitSharedElementCallback() पहली गतिविधि में और onMapSharedElements()

    override fun onMapSharedElements(names: MutableList<String>?,
                                 sharedElements: MutableMap<String, View>?) {
        // we will implement this in step 6                            
    }
  3. पहली गतिविधि में onActivityReenter() को supportPostponeEnterTransition() साथ संक्रमण स्थगित करें onActivityReenter() , जब तक कि हमने कुछ क्रियाएं नहीं कीं, तब तक संक्रमण दिखाने के लिए नहीं (जैसे हम आइटम को दिखाने के लिए सूची को स्क्रॉल करना चाहते हैं)।

  4. onActivityReenter() में Bundle बचाने के लिए जो आपने द्वितीय गतिविधि से Intent माध्यम से पारित किया है (हम चरण 7 में देखेंगे)।
  5. onActivityReenter() संक्रमण को स्थगित करने के बाद, इस बंडल में आपके द्वारा जोड़ी गई जानकारी के आधार पर UI में कुछ बदलाव करें विशेष रूप से, हमारे मामले में, इस बंडल में User की मूल Integer कुंजी शामिल होगी जिसमें दूसरी गतिविधि शुरू की गई थी। आपको इस कुंजी की सूची में User की मौजूदा जगह मिल सकती है, और उस नई स्थिति में RecyclerView स्क्रॉल करें। इस मद को देखने के बाद आप ट्रिगर को धक्का दे सकते हैं और सिस्टम को supportStartPostponedEnterTransition() द्वारा संक्रमण शुरू कर सकते हैं।
  6. SharedElementCallback::onMapSharedElements() जांचें कि मौसम 4 Bundle में सहेजा गया Bundle निरर्थक है या नहीं। अगर यह शून्य नहीं है, तो इसका मतलब होगा कि आपने दूसरी गतिविधि में कुछ बना दिया है और आप साझा तत्वों का पुनः होना चाहते हैं। इसका मतलब है कि आपको ऐसा कुछ करना है:

    override fun onMapSharedElements(names: MutableList<String>?,
                                     sharedElements: MutableMap<String, View>?) {
        // `reenterBundle` is the `Bundle` you have saved in step 3
        if (null != reenterBundle
                && reenterBundle!!.containsKey("KEY_FROM_ACTIVITY_2")
                && null != view) {
            val key = reenterBundle!!.getInt("KEY_FROM_ACTIVITY_2");
            val newSharedElement = ... // find corresponding view with the `key`
            val newTransitionName = ... // transition name of the view
    
            // clear previous mapping and add new one
            names?.clear()
            names?.add(newTransitionName)
            sharedElements?.clear()
            sharedElements?.put(newTransitionName, newSharedElement)
            reenterBundle = null
        } else {
            // The activity is exiting
        }                            
    }
  7. दूसरी गतिविधि ओवरराइड finishAfterTransition() :

    override fun finishAfterTransition() {
        val data = Intent()
        data.putExtra("KEY_FROM_ACTIVITY_2", 42) // `42` is the original position that we passed to this activity via Intent when launching it
        setResult(RESULT_OK, data)
        super.finishAfterTransition()
    }

यदि मेरा उपयोगकर्ता अब सूची पर दिखाई नहीं दे रहा है, तो मैं अलग ऐनिमेशन के साथ रिटर्न एनीमेशन कैसे बदल सकता हूं?

आप या तो इसे दृश्यमान बना सकते हैं (उदाहरण के लिए RecyclerView स्क्रॉल करके, इतना देखें कि आपका दृश्य दिखाई देता है), या आप names और sharedElements को साफ़ करके चरण 6 में साझा तत्वों के संक्रमण को हटा सकते हैं और उन में कुछ भी नहीं जोड़ सकते हैं।

मुझे आशा है कि आपने यह अवधारणा सीखा है कि यह कैसे काम करता है, हालांकि यह थोड़ा गंदा लगता है। लेकिन आपके लिए एक सहायता के रूप में मैं एक लिखित ऐप से कुछ कोड साझा कर सकता हूं:

मुख्य गतिविधि - मुख्यप्रदर्शक

DetailActivity





activity-transition