我正试图将RecyclerView
我尝试了很多东西:RelativeLayout作为父级,然后使用layout_centerInParent,使用基本的android:layout_gravity =“center”,尝试添加一些空格元素,使用权重和....
item_row.xml
但我没有成功:(
我有什么
我想要什么
活动
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
item_row.xml
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/cardView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true">
<!-- Recycler View Item Row -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imgThumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:background="@android:color/black" />
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="item name"
android:id="@+id/txtName"
android:layout_margin="5dp"
android:singleLine="false"
android:lines="2"
android:gravity="center" />
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:textAppearance="?android:attr/textAppearanceSmall"
android:id="@+id/txtCategory"
android:textStyle="italic"
android:textColor="#496fa9"
android:text="subtitle"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:layout_gravity="center" />
<ImageButton
android:id="@+id/imageButton"
android:layout_width="48dp"
android:layout_height="wrap_content"
android:background="@android:color/black"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:padding="8dp"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
我搜索了很多,发现了这个answer,但实际上我不知道如何为每一行项目创建一个LinearLayout
!
是最好的解决方案吗?
还有其他想法吗?
答案 0 :(得分:3)
您可以使用SpanSizeLookup为网格视图制作具有不同宽度的视图/项目。因此,您可以使用空视图做一些聪明来相应调整。可能更复杂或更简单,具体取决于您的布局实际变化的程度。
对于您在绘图上显示的特定情况,您将执行以下操作:
GridLayoutManager lm = new GridLayoutManager(context, 6);
lm.setSpanSizeLookup(new MySizeLookup());
public static class MySizeLookup extends SpanSizeLookup {
public int getSpanSize(int position) {
if(position >= 0 && position <= 2) {
return 2;
} else if (position == 3 || position == 6) {
return 1;
} else {
return 2;
}
}
}
并且你必须在你的适配器上创建,位置3和6是一个空/不可见的元素。像new View(context);
这样的东西只是为了占用额外的空间
答案 1 :(得分:2)
使用gridLayoutManager = new GridLayoutManager(context,6)
并覆盖setSpanSizeLookup
。
示例:
int totalSize=list.size();
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int span;
span = totalSize % 3;
if (totalSize < 3) {
return 6;
} else if (span == 0 || (position <= ((totalSize - 1) - span))) {
return 2;
} else if (span == 1) {
return 6;
} else {
return 3;
}
}
});
如果您想连续显示3个项目并保留在网格的中心,这将有效。
根据您的要求更改网格布局管理器跨度计数。
答案 2 :(得分:0)
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 6);
final int totalSize = customList.size();
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int extra;
extra = totalSize % 3;
if(extra == 0)
return 2;
if (totalSize - (position + 1) < extra) {
return (int) 6 / extra;
}
return 2;
}
});
recycler.setLayoutManager(layoutManager);
答案 3 :(得分:0)
GridLayoutManager layoutManager = new GridLayoutManager(getContext(), 6);
final int totalSize = customList.size();
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int rows = Math.round((totalSize / 3f) + 0.4f);
int itemInRow = Math.round(((position + 1) / 3f) + 0.4f);
if (rows == 1 || rows == itemInRow) {
int span = totalSize % 3;
if (span == 0) {
return 2;
}
return 6 / span;
}
return 2;
}
});