如何将回收站的物品集中起来?

我需要在每一行的中心元素,这样他们将像在这个样机。 我一直在寻找,是否有任何布局,这样的工作方式不看。 项在它们的行中居中。

mockup

我的代码中是这样的。enter image description here

125823 次浏览

我假设您正在使用 LinearLayoutManagerRecyclerView来获得 ListView风格的效果。在这种情况下,对每一行使用 horizontalLinearLayout,使用 android:gravity="center"将其内容居中。

RecyclerView的项目行布局中采用 LinearLayout,然后将 android:layout_gravity="center"赋予 LinearLayout

对于每一行图像,你必须采取不同的 LinearLayout

下面是示例代码:

 <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="horizontal">


<ImageView
android:id="@+id/image1"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:src="@drawable/image1" />


<ImageView
android:id="@+id/image2"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:src="@drawable/image2" />


<ImageView
android:id="@+id/image3"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:src="@drawable/image3" />


</LinearLayout>

您可以动态添加一些布局,例如:

  • 适配器对象可以是水平的 LinearLayout

1-用 Java 代码创建一个 LinearLayout 并对其进行定制(引力,...)

2-添加一些图标到线性布局

3-向适配器添加线性布局

4-重复1,2,3


    // : declare new horizontal linearLayout
ImageView myIcons[nomOfIcons];
// : add all icons to myIcons
for(int i=1; i<=nomOfIcons; i++){
linearLayout.addView(myIcons[i - 1]);
if(i%numOfIconsInOneHorizontalLinearLayout==0) {
results.add(linearLayout); // add linearLayout to adapter dataSet
// : declare new horizontal linearLayout
}
}
if(n%numOfIconsInOneHorizontalLinearLayout!=0) // add last linearLayout if not added in the loop
results.add(linearLayout);
mAdapter.notifyDataSetChanged(); // update adapter

使用 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个项目,并且保持在网格的中心,那么这将起作用。

根据需要更改网格布局管理器跨度计数。

将回收箱从 width改为 wrap_content,集装箱从 layout_gravity改为 center_horizontal

 <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">


<android.support.v7.widget.RecyclerView
android:id="@+id/recycrer_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp" />
</LinearLayout>

你可以使用来自 google 的新版 LayoutManager。 FlexLayoutManager 它将为您提供对回收视图项目的大量控制和灵活性

使用 com.google.android:flexbox库中的 FlexboxLayout。请注意 flexwrapjustifyContent属性值。然后,在之前要包装项行的视图上设置 layout_wrapBefore = true

    <com.google.android.flexbox.FlexboxLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:flexWrap="wrap"
app:justifyContent="center">


<View ... />


<View app:layout_wrapBefore="true" ... />


<View ... />


</com.google.android.flexbox.FlexboxLayout>

目前,我认为我们需要为它编写我们自己的自定义视图,因为 Android 还没有像我们期望的那样支持这个特性。

这是我做的样品,以备不时之需: Https://github.com/mttdat/utils

(通过调整 Manifest 文件以默认方式启动此活动来尝试 CenterGridActivity.kt)

成绩:

recyclerView.adapter = MyAdapter()
val layoutManager = FlexboxLayoutManager(context).apply {
justifyContent = JustifyContent.CENTER
alignItems = AlignItems.CENTER
flexDirection = FlexDirection.ROW
flexWrap = FlexWrap.WRAP
}
recyclerView.layoutManager = layoutManager

你需要将 FlexboxLayout加入到你的等级中:

implementation 'com.google.android.flexbox:flexbox:3.0.0'

enter image description here

相信我,会成功的。 在放置回收器视图的主 xml 文件中,复制我的代码。

    <LinearLayout
android:layout_width="match_parent"
android:layout_height="@dimen/_50sdp"
android:gravity="center">


<androidx.recyclerview.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="@dimen/_50sdp"/>


</LinearLayout>