GÜNCELLEME 1
Android Destek Kütüphanesi 23.2.0'dan beri setAutoMeasureEnabled(true)LayoutManagers için bir yöntem eklendi . RecyclerView'in içeriğini sarmasını sağlar ve bir cazibe gibi çalışır.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html
Yani böyle bir şey ekleyin:
LayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setAutoMeasureEnabled(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
GÜNCELLEME 2
27.1.0 setAutoMeasureEnabledkullanımdan kaldırıldığından, LayoutManager'ın geçersiz kılınmış yöntemle özel uygulamasını sağlamalısınızisAutoMeasureEnabled()
Ancak RecyclerView birçok kullanımdan sonra, sarma modunda kullanmamanızı şiddetle tavsiye ederim , çünkü bu amaçlandığı gibi değildir. Birkaç öğenin türüyle normal tek RecyclerView kullanarak tüm düzeninizi yeniden düzenlemeye çalışın. Veya aşağıda son çare olarak tanımladığım LinearLayout ile yaklaşımı kullanın
Eski cevap (önerilmez)
Sen kullanabilirsiniz RecyclerViewiçini NestedScrollView. Her şeyden önce sen kendi özel uygulamalıdır LinearLayoutManager, bu sizin kılan RecyclerViewiçeriğini sarmak için. Örneğin:
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);
}
}
Bundan sonra LayoutManagersizin için kullanınRecyclerView
recyclerView.setLayoutManager(new WrappingLinearLayoutManager(getContext()));
Ancak bu iki yöntemi de çağırmalısınız:
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setHasFixedSize(false);
Burada setNestedScrollingEnabled(false)kaydırmayı devre dışı RecyclerViewbırakın, böylece kaydırma olayını durdurmaz NestedScrollView. Ve setHasFixedSize(false)adaptör içeriğindeki değişikliklerin, cihazınRecyclerView
Önemli not: Bu çözüm bazı durumlarda biraz buggy ve perfomance ile ilgili sorunları var, bu nedenle, öğenizde çok fazla öğe varsa , liste görünümünün RecyclerViewözel LinearLayouttabanlı uygulamasını kullanmanızı , bunun için Adaptör analogunu oluşturmanızı ve bunu yapmanızı öneririm gibi davran ListViewya daRecyclerView