我需要在每一行的中心元素,这样他们将像在这个样机。 我一直在寻找,是否有任何布局,这样的工作方式不看。 项在它们的行中居中。
我的代码中是这样的。
我假设您正在使用 LinearLayoutManager和 RecyclerView来获得 ListView风格的效果。在这种情况下,对每一行使用 horizontalLinearLayout,使用 android:gravity="center"将其内容居中。
LinearLayoutManager
RecyclerView
ListView
horizontal
LinearLayout
android:gravity="center"
在 RecyclerView的项目行布局中采用 LinearLayout,然后将 android:layout_gravity="center"赋予 LinearLayout。
android:layout_gravity="center"
对于每一行图像,你必须采取不同的 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>
您可以动态添加一些布局,例如:
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。
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
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。请注意 flexwrap和 justifyContent属性值。然后,在之前要包装项行的视图上设置 layout_wrapBefore = true。
com.google.android:flexbox
FlexboxLayout
flexwrap
justifyContent
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'
相信我,会成功的。 在放置回收器视图的主 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>