আমার একটি 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.