আমিও এই সমস্যায় পড়েছিলাম, তবে আমার ক্ষেত্রে আমার একটি FragmentPagerAdapter
ছিল ViewPager
যা এর পৃষ্ঠাগুলি সরবরাহ করছিল । সমস্যা আমার কাছে তা থাকত ছিল onMeasure()
এর ViewPager
আগে কোন নাম ছিল Fragments
নির্মিত হয়েছে (এবং পারা না আকার নিজেই সঠিকভাবে)।
কিছুটা পরীক্ষা এবং ত্রুটির পরে, আমি দেখতে পেলাম যে finishUpdate()
ফ্রেগমেন্টপাগারএডাপ্টারের পদ্ধতিটি Fragments
প্রাথমিকভাবে (পরে থেকে ) instantiateItem()
শুরু করার FragmentPagerAdapter
পরে এবং পৃষ্ঠার স্ক্রোলিংয়ের পরে / পরে ডাকা হবে । আমি একটি ছোট ইন্টারফেস তৈরি করেছি:
public interface AdapterFinishUpdateCallbacks
{
void onFinishUpdate();
}
যা আমি আমার মধ্যে FragmentPagerAdapter
কল এবং কল:
@Override
public void finishUpdate(ViewGroup container)
{
super.finishUpdate(container);
if (this.listener != null)
{
this.listener.onFinishUpdate();
}
}
যার ফলে আমাকে setVariableHeight()
আমার CustomViewPager
প্রয়োগের দিকে আহ্বান জানায় :
public void setVariableHeight()
{
// super.measure() calls finishUpdate() in adapter, so need this to stop infinite loop
if (!this.isSettingHeight)
{
this.isSettingHeight = true;
int maxChildHeight = 0;
int widthMeasureSpec = MeasureSpec.makeMeasureSpec(getMeasuredWidth(), MeasureSpec.EXACTLY);
for (int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(ViewGroup.LayoutParams.WRAP_CONTENT, MeasureSpec.UNSPECIFIED));
maxChildHeight = child.getMeasuredHeight() > maxChildHeight ? child.getMeasuredHeight() : maxChildHeight;
}
int height = maxChildHeight + getPaddingTop() + getPaddingBottom();
int heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
super.measure(widthMeasureSpec, heightMeasureSpec);
requestLayout();
this.isSettingHeight = false;
}
}
আমি নিশ্চিত নই যে এটি সর্বোত্তম পন্থা, মন্তব্যগুলি ভাল লাগবে যদি আপনি এটি ভাল / খারাপ / মন্দ বলে মনে করেন তবে আমার প্রয়োগে এটি বেশ ভালভাবে কাজ করছে বলে মনে হয় :)
আশা করছি এটা ওখানে কাওকে সাহায্য করবে!
সম্পাদনা:requestLayout()
কল করার পরে আমি যুক্ত করতে ভুলে গেছি super.measure()
(অন্যথায় এটি ভিউটি পুনরায় আঁকবে না)।
আমি পিতামাতার প্যাডিং চূড়ান্ত উচ্চতায় যুক্ত করতে ভুলেও গিয়েছি।
আমি মূল প্রস্থ / উচ্চতা মেজারস্পেসগুলি প্রয়োজনীয় হিসাবে একটি নতুন তৈরির পক্ষে রেখেছি। সেই অনুযায়ী কোড আপডেট করেছেন।
আমার আর একটি সমস্যা ছিল যে এটি একটিতে নিজের আকারটি সঠিকভাবে তৈরি করবে না ScrollView
এবং খুঁজে পেল যে অপরাধী তার MeasureSpec.EXACTLY
পরিবর্তে শিশুটিকে মাপছে MeasureSpec.UNSPECIFIED
। এটি প্রতিফলিত আপডেট।
এই পরিবর্তনগুলি সমস্ত কোডে যুক্ত করা হয়েছে। আপনি চাইলে পুরানো (ভুল) সংস্করণগুলি দেখতে ইতিহাসটি পরীক্ষা করতে পারেন।