ওয়েন আমরা সেট 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পদ্ধতির কোনও কল নেই ।