ওয়েন আমরা সেট setHasFixedSize(true)
উপর RecyclerView
তার মানে এর recycler আকার সংশোধন করা হয়েছে এবং অ্যাডাপ্টারের বিষয়বস্তু দ্বারা প্রভাবিত হয় না। এবং এই ক্ষেত্রে onLayout
যখন আমরা অ্যাডাপ্ট্রারের ডেটা আপডেট করি তখন পুনর্ব্যবহারকারীকে ডাকা হবে না (তবে একটি ব্যতিক্রম রয়েছে)।
আসুন উদাহরণটিতে যাই:
RecyclerView
বেশ কয়েকটি পদ্ধতি সহ একটি RecyclerViewDataObserver
( এই ফাইলে ডিফল্ট প্রয়োগটি সন্ধান করুন ) রয়েছে, প্রধান গুরুত্বপূর্ণটি হ'ল:
void triggerUpdateProcessor() {
if (POST_UPDATES_ON_ANIMATION && mHasFixedSize && mIsAttached) {
ViewCompat.postOnAnimation(RecyclerView.this, mUpdateChildViewsRunnable);
} else {
mAdapterUpdateDuringMeasure = true;
requestLayout();
}
}
যদি আমরা setHasFixedSize(true)
কোনও অ্যাডাপ্টারের ডেটা সেট করে আপডেট করি তবে: এই পদ্ধতিটি বলা হয় notifyItemRangeChanged, notifyItemRangeInserted, notifyItemRangeRemoved or notifyItemRangeMoved
। এই ক্ষেত্রে পুনর্ব্যবহারকারীদের কাছে কোনও কল নেই onLayout
, তবে শিশুদের requestLayout
আপডেট করার জন্য কল রয়েছে calls
তবে আমরা যদি setHasFixedSize(true)
কোনও অ্যাডাপ্টারের ডেটা সেট করে আপডেট করি এবং notifyItemChanged
তারপরে onChange
পুনর্ব্যক্তিকারীর ডিফল্টের RecyclerViewDataObserver
কল এবং কল নেই triggerUpdateProcessor
। এই ক্ষেত্রে onLayout
যখনই আমরা সেট করি setHasFixedSize
true
বা রিসাইক্লার বলা হয় false
।
// no calls to triggerUpdateProcessor
@Override
public void onChanged() {
assertNotInLayoutOrScroll(null);
mState.mStructureChanged = true;
processDataSetCompletelyChanged(true);
if (!mAdapterHelper.hasPendingUpdates()) {
requestLayout();
}
}
// calls to triggerUpdateProcessor
@Override
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
assertNotInLayoutOrScroll(null);
if (mAdapterHelper.onItemRangeChanged(positionStart, itemCount, payload)) {
triggerUpdateProcessor();
}
}
কীভাবে নিজের দ্বারা চেক করবেন:
কাস্টম RecyclerView
এবং ওভাররাইড তৈরি করুন :
override fun requestLayout() {
Log.d("CustomRecycler", "requestLayout is called")
super.requestLayout()
}
override fun invalidate() {
Log.d("CustomRecycler", "invalidate is called")
super.invalidate()
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
Log.d("CustomRecycler", "onLayout is called")
super.onLayout(changed, l, t, r, b)
}
পুনর্ব্যবহারযোগ্য আকারটি match_parent
(xML এ) সেট করুন । অ্যাডাপ্টারের ডেটা ব্যবহার আপডেট করার চেষ্টা replaceData
এবং replaceOne
seting সঙ্গে setHasFixedSize(true)
এবং তারপর false
।
// onLayout is called every time
fun replaceAll(data: List<String>) {
dataSet.clear()
dataSet.addAll(data)
this.notifyDataSetChanged()
}
// onLayout is called only for setHasFixedSize(false)
fun replaceOne(data: List<String>) {
dataSet.removeAt(0)
dataSet.addAll(0, data[0])
this.notifyItemChanged(0)
}
এবং আপনার লগ চেক করুন।
আমার লগ:
// for replaceAll
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onMeasure is called
D/CustomRecycler: onMeasure is called
D/CustomRecycler: onLayout
D/CustomRecycler: requestLayout is called
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called
// for replaceOne
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called
D/CustomRecycler: requestLayout is called
D/CustomRecycler: onDraw is called
সংক্ষিপ্ত করা:
যদি আমরা setHasFixedSize(true)
কল করা ব্যতীত অন্য কোনও উপায়ে পর্যবেক্ষককে অবহিত করার সাথে অ্যাডাপ্টারের ডেটা সেট এবং আপডেট করে থাকি notifyDataSetChanged
তবে আপনার কিছুটা পারফরম্যান্স রয়েছে, কারণ রিসাইক্লার onLayout
পদ্ধতির কোনও কল নেই ।