আমার একটি DialogFragment
রয়েছে যা একটি RecyclerView
(কার্ডের একটি তালিকা) ধারণ করে ।
এর মধ্যে RecyclerView
এক বা একাধিক CardViews
যে কোনও উচ্চতা থাকতে পারে।
এর মধ্যে থাকা DialogFragment
এইগুলির উপর ভিত্তি করে আমি এটি সঠিক উচ্চতা দিতে চাই CardViews
।
সাধারণত এটি সহজ হবে, আমি এই মত সেট wrap_content
করা হবে RecyclerView
।
<android.support.v7.widget.RecyclerView ...
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:scrollbars="vertical" >
</android.support.v7.widget.RecyclerView>
যেহেতু আমি এটি ব্যবহার করছি RecyclerView
এটি কাজ করে না দেখুন:
https://issuetracker.google.com/issues/37001674
এবং
নেস্টেড রিসাইক্লার দেখার উচ্চতা এর সামগ্রীগুলিকে মোড়া করে না
এই উভয় পৃষ্ঠায় লোকেরা প্রসারিত LinearLayoutManager
এবং ওভাররাইড করার পরামর্শ দেয়onMeasure()
আমি প্রথম লেআউট ম্যানেজারটি ব্যবহার করেছি যা কেউ প্রথম লিঙ্কটিতে সরবরাহ করেছে:
public static class WrappingLayoutManager extends LinearLayoutManager {
public WrappingLayoutManager(Context context) {
super(context);
}
private int[] mMeasuredDimension = new int[2];
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
int widthSpec, int heightSpec) {
final int widthMode = View.MeasureSpec.getMode(widthSpec);
final int heightMode = View.MeasureSpec.getMode(heightSpec);
final int widthSize = View.MeasureSpec.getSize(widthSpec);
final int heightSize = View.MeasureSpec.getSize(heightSpec);
measureScrapChild(recycler, 0,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
int width = mMeasuredDimension[0];
int height = mMeasuredDimension[1];
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
width = widthSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
case View.MeasureSpec.AT_MOST:
height = heightSize;
break;
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(width, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
int heightSpec, int[] measuredDimension) {
View view = recycler.getViewForPosition(position);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth();
measuredDimension[1] = view.getMeasuredHeight();
recycler.recycleView(view);
}
}
}
তবে এটি কাজ করে না কারণ
heightSize = View.MeasureSpec.getSize(heightSpec);
সম্পর্কিত হতে পারে এমন একটি খুব বড় মান প্রদান করে match_parent
।
মন্তব্য করে height = heightSize;
(দ্বিতীয় স্যুইচ ক্ষেত্রে) আমি উচ্চতার কাজটি পরিচালনা করতে পেরেছি তবে কেবলমাত্র যদি TextView
সেই অভ্যন্তরের কোনও শিশু CardView
তার নিজস্ব পাঠ্য (দীর্ঘ বাক্য) না জড়িয়ে রাখে।
এটি TextView
মোড়ানোর সাথে সাথে এটির নিজস্ব পাঠ্যটি উচ্চতা বাড়ানো উচিত তবে তা হয় না। এটি একটি দীর্ঘ রেখার জন্য উচ্চতা গণনা করেছে একটি একক লাইন হিসাবে, একটি মোড়ানো রেখা (2 বা তার বেশি) নয়।
কিভাবে আমি এই উন্নতি করবে কোন পরামর্শ LayoutManager
তাই আমার RecyclerView
সাথে কাজে WRAP_CONTENT
?
সম্পাদনা করুন: এই লেআউট ম্যানেজারটি বেশিরভাগ লোকের পক্ষে কাজ করতে পারে তবে এটি এখনও পাঠ্যদর্শনগুলি মোড়ানো করার জন্য উচ্চতর স্ক্রোলিং এবং গণনা করতে সমস্যা রয়েছে it
public class MyLinearLayoutManager extends LinearLayoutManager {
public MyLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
private int[] mMeasuredDimension = new int[2];
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
int widthSpec, int heightSpec) {
final int widthMode = View.MeasureSpec.getMode(widthSpec);
final int heightMode = View.MeasureSpec.getMode(heightSpec);
final int widthSize = View.MeasureSpec.getSize(widthSpec);
final int heightSize = View.MeasureSpec.getSize(heightSpec);
int width = 0;
int height = 0;
for (int i = 0; i < getItemCount(); i++) {
measureScrapChild(recycler, i,
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
if (getOrientation() == HORIZONTAL) {
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
height = height + mMeasuredDimension[1];
if (i == 0) {
width = mMeasuredDimension[0];
}
}
}
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
width = widthSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
height = heightSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(width, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
int heightSpec, int[] measuredDimension) {
View view = recycler.getViewForPosition(position);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
}
}
Jan 22, 2016: This has been merged into the internal tree, should be available with the next version of support library.