在Android中,是否可以通过编程方式为RecyclerView子项设置重力?

5

我正在尝试为RecyclerView中的子项设置重力,但似乎LayoutParams没有重力方法。我已经尝试了以下方法:

RecyclerView.LayoutParams params = new RecyclerView.LayoutParams(
                RecyclerView.LayoutParams.WRAP_CONTENT, RecyclerView.LayoutParams.WRAP_CONTENT);

我也尝试了以下方法:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

在这两种情况下,params.setMargin(int, int, int, int) 均能正常工作,并且边距设置正确。
我的 RecyclerView:
<android.support.v7.widget.RecyclerView
    android:id="@+id/messages_list_view"
    android:scrollbars="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar"
    android:layout_marginTop="20dp"/>

我的RelativeLayout(RecyclerView的子项):

<RelativeLayout
android:id="@+id/message_text_wrapper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:clickable="true"
android:background="@drawable/chat_bubble"
android:layout_margin="16dp"
android:padding="10dp"
xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/message_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:textColor="@android:color/primary_text_light"
        android:textSize="18sp"
        />

</RelativeLayout>

我希望能够实现params.setGravity(int)或任何其他可行的方法。谢谢。

这里的答案有帮助吗?https://dev59.com/3Ynca4cB1Zd3GeqP9leU - user4989692
很遗憾,它不支持! - Loolooii
3个回答

1

将项目视图包装在FrameLayout中,确保其layout_width设置为match_parent

给您在FrameLayout中包装的布局分配一个ID,并将其连接到您的ViewHolder。(我认为您已经使用@+id/message_text_wrapper完成了此操作)

然后在onBindViewHolder中执行以下操作:

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) holder.yourLayout.getLayoutParams()
if (condition) {
    params.gravity = Gravity.END // or Gravity.RIGHT
} else {
    params.gravity = Gravity.START // or Gravity.LEFT
}

Wrapping layout 意味着只为设置 gravity 而存在的冗余父级。从性能角度考虑,特别是对于列表项来说并不是很好。 - IliaEremin

0

在 onBindViewHolder 中使用 Java,为 TextView 设置属性,这对我很有效。

`mTextView.setGravity(Gravity.CENTER_HORIZONTAL);`

Android Studio会告诉你,Gravity.CENTER_HORIZONTAL属性的值为整数1,因此你可以直接输入该整数。

其他属性包括:
Gravity.CENTER = 整数17
Gravity.RIGHT = 整数5
Gravity.LEFT = 整数3
Gravity.TOP = 整数48
Gravity.BOTTOM = 整数80

等等


0
我会将 RelativeLayout 包裹在一个带有 android:width="match_parent"FrameLayout 中,然后在 FrameLayout 上设置左/右对齐的重力。

这对我没有用,但如果你确定这会起作用,能否提供示例代码?谢谢。 - Loolooii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接