更改RecyclerView网格布局中的列数

我正在尝试根据显示大小更改回收站视图(网格布局)中出现的列数。 但是我找不出一个合适的方法来实现它。 目前,我正在使用treeViewObserver来根据屏幕大小的变化(在方向)更改列数。 因此,如果应用程序在纵向模式下打开,那么它决定为一列,这看起来不错,但是当应用程序直接以横向模式打开时,该方法不起作用显示在屏幕上。

这里recList是RecyclerView&glm是RecyclerView中使用的GridLayoutManager

  viewWidth = recList.getMeasuredWidth(); cardViewWidthZZ = recList.getChildAt(0).getMeasuredWidth(); if (oldWidth == 0) { oldWidth = cardViewWidthZZ; } if (oldWidth <= 0) return; int newSpanCount = (int) Math.floor(viewWidth / (oldWidth / 1.3f)); if (newSpanCount <= 0) newSpanCount = 1; glm.setSpanCount(newSpanCount); glm.requestLayout(); 

最好的祝福

Solutions Collecting From Web of "更改RecyclerView网格布局中的列数"

 public class VarColumnGridLayoutManager extends GridLayoutManager { private int minItemWidth; public VarColumnGridLayoutManager(Context context, int minItemWidth) { super(context, 1); this.minItemWidth = minItemWidth; } @Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { updateSpanCount(); super.onLayoutChildren(recycler, state); } private void updateSpanCount() { int spanCount = getWidth() / minItemWidth; if (spanCount < 1) { spanCount = 1; } this.setSpanCount(spanCount); }} 

如果您提供固定的列宽,则可以扩展RecyclerView并相应地在onMeasure设置跨度计数:

 public AutofitRecyclerView(Context context, AttributeSet attrs) { super(context, attrs); if (attrs != null) { // Read android:columnWidth from xml int[] attrsArray = { android.R.attr.columnWidth }; TypedArray array = context.obtainStyledAttributes(attrs, attrsArray); columnWidth = array.getDimensionPixelSize(0, -1); array.recycle(); } manager = new GridLayoutManager(getContext(), 1); setLayoutManager(manager); } protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); if (columnWidth > 0) { int spanCount = Math.max(1, getMeasuredWidth() / columnWidth); manager.setSpanCount(spanCount); } } 

看到我的博客文章了解更多信息: http : //blog.sqisland.com/2014/12/recyclerview-autofit-grid.html

这是我的解决scheme。

 public class ResponsiveGridLayoutManager extends GridLayoutManager { boolean hasSetupColumns; int columnWidthPx; public ResponsiveGridLayoutManager(Context context, int orientation, boolean reverseLayout, int columnWidthUnit, float columnWidth) { super(context, 1, orientation, reverseLayout); Resources r; if (context == null) { r = Resources.getSystem(); } else { r = context.getResources(); } float colWidthPx = TypedValue.applyDimension(columnWidthUnit, columnWidth, r.getDisplayMetrics()); this.columnWidthPx = Math.round(colWidthPx); } public ResponsiveGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); int[] requestedValues = { android.R.attr.columnWidth, }; TypedArray a = context.obtainStyledAttributes(attrs, requestedValues); this.columnWidthPx = a.getDimensionPixelSize(0, -1); a.recycle(); } @Override public int getWidth() { int width = super.getWidth(); if (!hasSetupColumns && width > 0) { this.setSpanCount((int)Math.floor(width / this.columnWidthPx)); } return width; } } 

您可以使用任何XML:

 <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent" app:layoutManager="com.caff.localflix.ResponsiveGridLayoutManager" android:columnWidth="148dp" /> 

或Java:

 ResponsiveGridLayoutManager layoutManager = new ResponsiveGridLayoutManager( this, GridLayoutManager.VERTICAL, false, TypedValue.COMPLEX_UNIT_DIP, 148f ); 

您可以创build一个屏幕相关资源文件并加载它。 例如,值为w820p文件夹中的booleans.xml。 或者可能只是创build一个大屏幕的布局,并完成它。