यह एक मुश्किल स्थिति है, क्षमा करें कि डॉक्स पर्याप्त नहीं हैं।
जब एडेप्टर सामग्री बदल जाती है (और आप कॉल करते हैं notify***()
) RecyclerView एक नए लेआउट का अनुरोध करता है। उस क्षण से, जब तक कि लेआउट सिस्टम एक नए लेआउट (<16 एमएस) की गणना करने का निर्णय नहीं लेता है, तब तक लेआउट की स्थिति और एडेप्टर की स्थिति मेल नहीं खा सकती है क्योंकि लेआउट ने अभी तक एडेप्टर परिवर्तन को प्रतिबिंबित नहीं किया है।
आपके उपयोग के मामले में, चूंकि आपका डेटा आपकी एडॉप्टर सामग्री से संबंधित है (और मुझे लगता है कि एडॉप्टर परिवर्तनों के साथ डेटा उसी समय बदल जाता है), आपको उपयोग करना चाहिए adapterPosition
।
हालांकि, यदि आप कॉल कर रहे हैं, तो सावधान रहें notifyDataSetChanged()
, क्योंकि यह सब कुछ अमान्य करता है, RecyclerView को पता नहीं है कि अगले लेआउट की गणना होने तक ViewHolder के एडाप्टर की स्थिति क्या है। उस स्थिति में, getAdapterPosition()
वापस आ जाएगी RecyclerView#NO_POSITION
( -1
)।
लेकिन अगर आपने कहा है notifyItemInserted(0)
, तो getAdapterPosition()
ViewHolder की स्थिति जो पहले थी, 0
उसे 1
तुरंत वापस करना शुरू कर देगा । तो जब तक आप दानेदार सूचनाओं को भेज रहे हैं, आप हमेशा अच्छी स्थिति में होते हैं (हम एडेप्टर की स्थिति जानते हैं, हालांकि नए लेआउट की गणना अभी तक नहीं की गई है)।
एक अन्य उदाहरण, यदि आप उपयोगकर्ता क्लिक पर कुछ कर रहे हैं, यदि getAdapterPosition()
रिटर्न देता है NO_POSITION
, तो उस क्लिक को अनदेखा करना सबसे अच्छा है क्योंकि आप नहीं जानते कि उपयोगकर्ता ने क्या क्लिक किया (जब तक कि आपके पास कोई अन्य तंत्र नहीं है, जैसे आइटम देखने के लिए स्थिर आईडी)।
जब लेआउट की स्थिति अच्छी हो तो संपादित करें
कहते हैं कि आप उपयोग कर रहे हैं LinearLayoutManager
और वर्तमान में क्लिक की गई वस्तु के ऊपर ViewHolder को एक्सेस करना चाहते हैं। उस स्थिति में, आपको आइटम को ऊपर लाने के लिए लेआउट स्थिति का उपयोग करना चाहिए।
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
आपको लेआउट स्थिति का उपयोग करना होगा क्योंकि यह मेल खाता है कि उपयोगकर्ता वर्तमान में स्क्रीन पर क्या देख रहा है।