আপডেট 1
অ্যান্ড্রয়েড সমর্থন লাইব্রেরি ২৩.২.০ লেআউট ম্যানেজারগুলির setAutoMeasureEnabled(true)
জন্য যুক্ত পদ্ধতি ছিল । এটি এর বিষয়বস্তু মোড়ানোর জন্য এটি রিসাইক্লারভিউকে তোলে এবং একটি কবজির মতো কাজ করে।
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
সুতরাং এই জাতীয় কিছু যুক্ত করুন:
LayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
আপডেট 2
27.1.0 থেকে setAutoMeasureEnabled
অবচিত করা হয়েছে, তাই আপনার ওভাররাইড পদ্ধতিতে কাস্টম প্রয়োগ করা উচিতisAutoMeasureEnabled()
তবে রিসাইক্লার ভিউ ব্যবহারের বেশ কয়েকটি ক্ষেত্রে আমি দৃ .়ভাবে এটি মোড়ানো মোডে ব্যবহার না করার পরামর্শ দিচ্ছি , কারণ এটি এটির উদ্দেশ্যে নয়। বেশ কয়েকটি আইটেমের প্রকারের সাথে সাধারণ একক পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করে আপনার লেআউটটি পুরো রিফ্যাক্টর করার চেষ্টা করুন। বা লিনিয়ারলআউটের সাথে দৃষ্টিভঙ্গি ব্যবহার করুন যা আমি নীচে সর্বশেষ উপায় হিসাবে বর্ণনা করেছি
পুরানো উত্তর (প্রস্তাবিত নয়)
আপনি RecyclerView
ভিতরে ব্যবহার করতে পারেন NestedScrollView
। সবার আগে আপনার নিজের কাস্টমটি প্রয়োগ করা উচিত LinearLayoutManager
, এটি RecyclerView
আপনাকে এর সামগ্রীতে মোড়ানো করতে সহায়তা করে। উদাহরণ স্বরূপ:
public class WrappingLinearLayoutManager extends LinearLayoutManager
{
public WrappingLinearLayoutManager(Context context) {
super(context);
}
private int[] mMeasuredDimension = new int[2];
@Override
public boolean canScrollVertically() {
return false;
}
@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++) {
if (getOrientation() == HORIZONTAL) {
measureScrapChild(recycler, i,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
heightSpec,
mMeasuredDimension);
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
measureScrapChild(recycler, i,
widthSpec,
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
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.getVisibility() == View.GONE) {
measuredDimension[0] = 0;
measuredDimension[1] = 0;
return;
}
// For adding Item Decor Insets to view
super.measureChildWithMargins(view, 0, 0);
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(
widthSpec,
getPaddingLeft() + getPaddingRight() + getDecoratedLeft(view) + getDecoratedRight(view),
p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(
heightSpec,
getPaddingTop() + getPaddingBottom() + getDecoratedTop(view) + getDecoratedBottom(view),
p.height);
view.measure(childWidthSpec, childHeightSpec);
// Get decorated measurements
measuredDimension[0] = getDecoratedMeasuredWidth(view) + p.leftMargin + p.rightMargin;
measuredDimension[1] = getDecoratedMeasuredHeight(view) + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
}
এর পরে এটি LayoutManager
আপনার জন্য ব্যবহার করুনRecyclerView
recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));
তবে আপনার সেই দুটি পদ্ধতিরও কল করা উচিত:
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);
এখানে এর setNestedScrollingEnabled(false)
জন্য স্ক্রোলিং অক্ষম করুন RecyclerView
, যাতে এটি থেকে স্ক্রোলিং ইভেন্টটি বাধা দেয় না NestedScrollView
। এবং setHasFixedSize(false)
নির্ধারণ করুন যে অ্যাডাপ্টারের সামগ্রীতে পরিবর্তনগুলি এর আকার পরিবর্তন করতে পারেRecyclerView
গুরুত্বপূর্ণ দ্রষ্টব্য: এই সমাধানটি কিছু ক্ষেত্রে সামান্য বগী এবং পারফরম্যান্স নিয়ে সমস্যা রয়েছে, তাই আপনার যদি প্রচুর আইটেম থাকে তবে RecyclerView
আমি LinearLayout
তালিকা দর্শনের কাস্টম ভিত্তিক প্রয়োগ ব্যবহার করার পরামর্শ দিচ্ছি , এটির জন্য অ্যাডাপ্টারের অ্যানালগ তৈরি করে এটি তৈরি করুন মত আচরণ করা ListView
বাRecyclerView