এটি একটি জটিল পরিস্থিতি, দুঃখিত যে ডক্স যথেষ্ট নয়।
যখন অ্যাডাপ্টারের সামগ্রী পরিবর্তন হয় (এবং আপনি কল করেন notify***()
) তখন রিসাইক্লারভিউ একটি নতুন বিন্যাসের জন্য অনুরোধ করে। সেই মুহুর্ত থেকে, লেআউট সিস্টেম কোনও নতুন লেআউট (<16 এমএস) গণনা করার সিদ্ধান্ত না নেওয়া পর্যন্ত লেআউট অবস্থান এবং অ্যাডাপ্টারের অবস্থানটি মেলে না কারণ লেআউটটি এখনও অ্যাডাপ্টারের পরিবর্তনগুলি প্রতিফলিত করে না।
আপনার ব্যবহারের ক্ষেত্রে, যেহেতু আপনার ডেটা আপনার অ্যাডাপ্টারের সামগ্রীর সাথে সম্পর্কিত (এবং আমি ধরে নিই যে অ্যাডাপ্টারের পরিবর্তনের সাথে ডেটা একই সময়ে পরিবর্তিত হয়েছিল), আপনার ব্যবহার করা উচিত adapterPosition
।
সতর্ক থাকুন, যদি আপনি কল করছেন notifyDataSetChanged()
, কারণ এটি সবকিছুকে অকার্যকর করে দেয়, রিসাইক্লার ভিউ জানেন না যে পরবর্তী লেআউটটি গণনা করা না হওয়া পর্যন্ত ভিউহোল্ডারের অ্যাডাপ্টারের অবস্থানটি জানেন না। সেক্ষেত্রে, getAdapterPosition()
ফিরে আসবে RecyclerView#NO_POSITION
( -1
)।
তবে আপনি যদি কল করেছেন তবে বলতে দিন notifyItemInserted(0)
, getAdapterPosition()
ভিউহোল্ডার যা পূর্বে অবস্থিত ছিল তা অবিলম্বে 0
ফিরে আসতে শুরু করবে 1
। সুতরাং আপনি যতক্ষণ না দানাদার বিজ্ঞপ্তি ইভেন্টগুলি প্রেরণ করছেন, আপনি সর্বদা ভাল অবস্থায় আছেন (আমরা নতুন লেআউটটি এখনও গণনা না করা সত্ত্বেও আমরা অ্যাডাপ্টারের অবস্থান জানি)।
আরেকটি উদাহরণ, আপনি যদি ব্যবহারকারী ক্লিকতে কিছু করছেন, যদি getAdapterPosition()
ফিরে আসে তবে সেই ক্লিকটিকে NO_POSITION
উপেক্ষা করা ভাল কারণ আপনি কী জানেন যে ব্যবহারকারী কী ক্লিক করেছেন (যদি না আপনার আইটেমটি দেখার জন্য অন্য কোনও প্রক্রিয়া যেমন, স্থির আইডি না থাকে)।
যখন লেআউট অবস্থান ভাল হয় জন্য সম্পাদনা করুন
আপনাকে LinearLayoutManager
এখন ক্লিক করা আইটেমের উপরে ভিউহোল্ডারটি ব্যবহার করতে এবং অ্যাক্সেস করতে চাই তা বলতে দিন । সেক্ষেত্রে উপরের আইটেমটি পেতে আপনার বিন্যাসের অবস্থানটি ব্যবহার করা উচিত।
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
আপনাকে লেআউট অবস্থানটি ব্যবহার করতে হবে কারণ এটি বর্তমানে স্ক্রিনে ব্যবহারকারী যা দেখছেন তার সাথে এটি মেলে।