【问题标题】:how to get column width changing with the inner text length in recyclerview如何使列宽随recyclerview中的内部文本长度而变化
【发布时间】:2018-05-13 04:32:58
【问题描述】:

我必须在TextViews 中表示一些短句。我使用recyclerViewGridLayoutManager 来做到这一点,并将每个句子设置在网格每个单元格上的TextView 上。问题是我希望网格的每个单元格根据TextView 中的文本更改其宽度。我的意思是,一个长句子可以占据整个屏幕宽度,或者如果句子很短,它们必须在同一行。

我也尝试使用GridView,但我也无法获得想要的结果。

知道如何获得它吗?

编辑

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="5dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/unselected_term"
        android:padding="10dp">

        <TextView
            android:id="@+id/item_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textColor="@color/term_text"
            android:gravity="center"
            android:textSize="18sp"/>

</LinearLayout>

编辑 2

这是布局应该是什么样子的示例。每个元素的长度并不总是相同的。所以我需要一个布局,让较大的元素比较短的元素具有更大的宽度。

【问题讨论】:

  • 你能把你的xml贴在这里吗?您用于 recyclerview 项目的布局
  • @Umair 代码已添加 :)
  • 我已经更新了答案,请检查并告诉我它是否适合你。

标签: android gridview layout android-recyclerview


【解决方案1】:

使用这个 gradle

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

尝试将此布局用于您的回收站视图

FlexboxLayoutManager flexLayout = new FlexboxLayoutManager( MainActivity.this );
recyclerView.setLayoutManager( flexLayout );

【讨论】:

    【解决方案2】:

    使用下面的布局将根据您的文本更改您的行项目大小。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="5dp">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryLight"
        android:padding="10dp">
    
        <TextView
            android:id="@+id/item_text"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:minWidth="100dp"
            android:textColor="@color/primary_text"
            android:gravity="center"
            android:textSize="18sp"/>
    
       </LinearLayout>
    </LinearLayout>
    

    【讨论】:

    • 如果你想在没有文本的情况下保持不宽度,然后从 textview 中删除 android:minWidth 属性。
    • 感谢您的帮助,但这并不能解决问题,因为元素始终位于两列中。我上传了一张图片以更好地展示我想要完成的工作。
    • 图片上的元素只是一个例子。每次查询数据库时,元素长度都会发生变化。所以,也许 recyclerview 上只有很长的元素,所以我需要每行一个元素,占据整个宽度。但是可能只有短元素,所以我需要每行有 3 或 4 个......顺序将是随机的
    • @IvánRodríguezTorres 那么你必须像另一个答案所建议的那样实施 StaggeredGridLayout 。如果你想自己实现,那将花费你很多时间。您可以通过为每个视图赋予 wrap_content 宽度来实现这一点,这样每个视图都将根据文本获取宽度,并且整个布局将是动态的。
    • 是的,另一个问题建议使用它。我正在尝试这样做,但我没有得到任何与预期结果相似的结果。例如,如果我将spanCount 设置为 3,我将无法获得全宽元素,或者如果我将其设置为 1,我将无法获得行宽几个短元素。你能向我解释一下如何解决这个问题吗?谢谢
    【解决方案3】:

    您需要将StaggeredGridLayoutManager 用于您的RecycelrViewStaggeredGridLayoutManager 关于那个和使用。

    【讨论】:

    • 您能详细说明一下吗?我在玩 StaggeredGrid,但没有得到想要的结果。问题是我需要的列数和行数是动态的。它会根据加载的文本而改变。我更新了问题以澄清。
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多