【问题标题】:How to center items in a Recyclerview?如何在 Recyclerview 中将项目居中?
【发布时间】:2019-05-27 10:11:15
【问题描述】:

我正在使用带有 Cardview 项目的 RecyclerView。我将 GridLayoutManager 设置为在每行显示 2 个项目,我希望它像这样在所有手机上居中:

预期结果

但我目前有这些:

实际结果

我尝试了不同的糟糕解决方案(paddingLeft...),但它适用于屏幕较大的手机,不适用于较小的手机。

content_main.xml 看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:card_view="http://schemas.android.com/tools">

    <SearchView
        android:id="@+id/searchView"
        android:layout_width="match_parent"
        android:queryHint="Rechercher un film"
        android:iconifiedByDefault="false"
        android:layout_marginTop="65dp"
        android:layout_marginBottom="10dp"
        android:layout_height="30dp" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/movies_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_below="@+id/searchView"
        android:scrollbars="vertical"
        card_view:cardCornerRadius="5dp"
        card_view:cardElevation="5dp"
        card_view:cardUseCompatPadding="true" />


</RelativeLayout>

movie_card.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<android.support.v7.widget.CardView
    android:id="@+id/cardView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <RelativeLayout
        android:layout_width="170dip"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/item_movie_poster"
            android:layout_width="170dip"
            android:layout_height="256dip"
            android:layout_centerHorizontal="true"
            android:contentDescription="@string/movie_image_description"
            android:scaleType="centerCrop" />

        <TextView
            android:id="@+id/item_movie_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/item_movie_poster"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="10dip"
            android:layout_marginTop="5dip"
            android:textSize="15sp"
            android:textAlignment="center"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:textStyle="bold" />

    </RelativeLayout>
</android.support.v7.widget.CardView>
</LinearLayout>

还有 app_bar_main.xml 其中包含 content_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

</android.support.design.widget.CoordinatorLayout>

【问题讨论】:

    标签: android xml android-layout android-recyclerview android-cardview


    【解决方案1】:

    在您的回收站视图中设置右边距或左边距:-

    <android.support.v7.widget.RecyclerView
            android:id="@+id/movies_list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/searchView"
            android:scrollbars="vertical"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            card_view:cardCornerRadius="5dp"
            card_view:cardElevation="5dp"
            card_view:cardUseCompatPadding="true" />
    

    【讨论】:

    • 如果您有任何疑问,请发表评论
    【解决方案2】:

    在您的movie_card.xml 中将宽度设置为match_parent 并添加重力

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" //<-- change
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" //<-- add
    android:orientation="vertical">
    

    【讨论】:

      【解决方案3】:

      由于您使用 GridLayoutManagercard_view.xml 父视图宽度设置为 match_parent

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent" //change
      android:layout_height="wrap_content"
      android:gravity="center"//add this
      android:orientation="vertical">
      

      或者你可以把RelativeLayout设置成CardViewcenterInParenttrue

      如有任何疑问,请发表评论

      希望这会有所帮助。编码愉快!

      【讨论】:

      • 感谢您的帮助,我尝试了您的解决方案和@MehulSolanki 的解决方案,它有效!
      【解决方案4】:

      检查下面的代码。您需要删除android:layout_alignParentStart="true" 并在您的RecyclerView 中添加 android:layout_centerInParent="true"

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout android:layout_height="match_parent"
          android:layout_width="match_parent"
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:card_view="http://schemas.android.com/tools">
      
          <SearchView
              android:id="@+id/searchView"
              android:layout_width="match_parent"
              android:queryHint="Rechercher un film"
              android:iconifiedByDefault="false"
              android:layout_marginTop="65dp"
              android:layout_marginBottom="10dp"
              android:layout_height="30dp" />
      
          <android.support.v7.widget.RecyclerView
              android:id="@+id/movies_list"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
      
              android:layout_centerInParent="true"
              android:layout_below="@+id/searchView"
              android:scrollbars="vertical"
              card_view:cardCornerRadius="5dp"
              card_view:cardElevation="5dp"
              card_view:cardUseCompatPadding="true" />
      
          </RelativeLayout>
      

      我希望这对你有用。

      【讨论】:

      • 感谢您的帮助,但项目仍然卡在我的 Pixel 3 模拟器的左侧:/
      • @VanDiest 我更新了答案,现在试试。将您的根相对布局高度宽度更改为match_parent,如果它适合您,请接受
      • 我尝试了您的新更改,但它不起作用,我不知道为什么:(
      • 抱歉,忘记我的最后一条消息,它适用于您的解决方案以及@Omkar 解决方案!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      • 2018-10-24
      • 2016-02-19
      • 2017-07-18
      相关资源
      最近更新 更多