GridLayoutManager 中可变列数
Variable number of columns in GridLayoutManager
我想在使用 RecyclerView 时在 GridLayoutManager 的一行中显示可变数量的列。要显示的列数取决于列的 TextView 的大小。
我不知道列宽,因为文本是动态放入其中的。
有人能帮忙吗? StaggeredGridLayoutManager 没有解决我的目的,因为它自定义高度但采用固定数量的列。
看看 GridLayoutManager
的 setSpanSizeLookup
方法。它允许您为 RecyclerView
的特定位置指定跨度大小。所以也许您可以使用它来满足您对可变列号的要求。
编辑:
GridLayoutManager manager = new GridLayoutManager(context, 2); // MAX NUMBER OF SPACES
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 1 || position == 6) {
return 2; // ITEMS AT POSITION 1 AND 6 OCCUPY 2 SPACES
} else {
return 1; // OTHER ITEMS OCCUPY ONLY A SINGLE SPACE
}
}
});
使用这种布局时 manager
您的 RecyclerView
应该如下所示:
+---+---+
| 0 | |
+---+---+
| 1 |
+---+---+
| 2 | 3 |
+---+---+
| 4 | 5 |
+---+---+
| 6 |
+---+---+
(只有带数字的方框代表您的RecyclerView
项,其他方框只是空白)
如果您想进行如下变化:4 列、5 列、6 列...
您可以获得此数字 (60) 之间的 MMC(最小公用倍数)并设置 GridLayoutManager:
GridLayoutManager manager = new GridLayoutManager(context, 60); // set the grid with the MMC
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 12; // 60/12 = 5 Columns
}
});
</pre>
然后你可以 return 10、12 或 15 用于 getSpanSize() 上的 6、5 和 4 列
您可以使用基于计算宽度的跨度。
public class AutoFitGridLayoutManager extends GridLayoutManager {
private boolean columnWidthChanged = true;
Context context;
public AutoFitGridLayoutManager(Context context) {
super(context, 1);
this.context = context;
setColumnWidth();
}
public void setColumnWidth() {
columnWidthChanged = true;
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
if (columnWidthChanged) {
//int spanCount = Math.max(1, totalSpace / columnWidth);
//setSpanCount(spanCount);
setSpanCount(Utils.calculateNoOfColumns(context));
columnWidthChanged = false;
}
super.onLayoutChildren(recycler, state);
}
}
要计算列,您可以使用此方法:
public static int calculateNoOfColumns(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
int scalingFactor = 200; // You can vary the value held by the scalingFactor
// variable. The smaller it is the more no. of columns you can display, and the
// larger the value the less no. of columns will be calculated. It is the scaling
// factor to tweak to your needs.
int columnCount = (int) (dpWidth / scalingFactor);
return (columnCount>=2?columnCount:2); // if column no. is less than 2, we still display 2 columns
}
我想在使用 RecyclerView 时在 GridLayoutManager 的一行中显示可变数量的列。要显示的列数取决于列的 TextView 的大小。
我不知道列宽,因为文本是动态放入其中的。
有人能帮忙吗? StaggeredGridLayoutManager 没有解决我的目的,因为它自定义高度但采用固定数量的列。
看看 GridLayoutManager
的 setSpanSizeLookup
方法。它允许您为 RecyclerView
的特定位置指定跨度大小。所以也许您可以使用它来满足您对可变列号的要求。
编辑:
GridLayoutManager manager = new GridLayoutManager(context, 2); // MAX NUMBER OF SPACES
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 1 || position == 6) {
return 2; // ITEMS AT POSITION 1 AND 6 OCCUPY 2 SPACES
} else {
return 1; // OTHER ITEMS OCCUPY ONLY A SINGLE SPACE
}
}
});
使用这种布局时 manager
您的 RecyclerView
应该如下所示:
+---+---+
| 0 | |
+---+---+
| 1 |
+---+---+
| 2 | 3 |
+---+---+
| 4 | 5 |
+---+---+
| 6 |
+---+---+
(只有带数字的方框代表您的RecyclerView
项,其他方框只是空白)
如果您想进行如下变化:4 列、5 列、6 列... 您可以获得此数字 (60) 之间的 MMC(最小公用倍数)并设置 GridLayoutManager:
GridLayoutManager manager = new GridLayoutManager(context, 60); // set the grid with the MMC
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 12; // 60/12 = 5 Columns
}
});
</pre>
然后你可以 return 10、12 或 15 用于 getSpanSize() 上的 6、5 和 4 列
您可以使用基于计算宽度的跨度。
public class AutoFitGridLayoutManager extends GridLayoutManager {
private boolean columnWidthChanged = true;
Context context;
public AutoFitGridLayoutManager(Context context) {
super(context, 1);
this.context = context;
setColumnWidth();
}
public void setColumnWidth() {
columnWidthChanged = true;
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
if (columnWidthChanged) {
//int spanCount = Math.max(1, totalSpace / columnWidth);
//setSpanCount(spanCount);
setSpanCount(Utils.calculateNoOfColumns(context));
columnWidthChanged = false;
}
super.onLayoutChildren(recycler, state);
}
}
要计算列,您可以使用此方法:
public static int calculateNoOfColumns(Context context) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
int scalingFactor = 200; // You can vary the value held by the scalingFactor
// variable. The smaller it is the more no. of columns you can display, and the
// larger the value the less no. of columns will be calculated. It is the scaling
// factor to tweak to your needs.
int columnCount = (int) (dpWidth / scalingFactor);
return (columnCount>=2?columnCount:2); // if column no. is less than 2, we still display 2 columns
}