将单个项目对齐到RecyclerView android中心

时间:2016-06-15 09:13:18

标签: android android-recyclerview android-gravity

  

假设我在RecyclerView中有一个或两个项目。如何在中心中显示它们     RecyclerView的宽度和高度必须是match_parent

AFAIK recyclerViewtop开始。我怎样才能将gravity = center提供给single item。我的意思是如果只有一个项目,它应该在屏幕的中心。 RecylerView 没有gravity attribute。还有其他方法吗?

我无法将它的高度设置为wrap_content。因为我还要添加一个swipeRefreshLayout。

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/MatchMatch"
    android:background="@color/theme_color_gift_finder">

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

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/activity_main_swipe_refresh_layout"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/rv_gift_menu"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/margin_pad_10" />

        </android.support.v4.widget.SwipeRefreshLayout>

        <LinearLayout
            android:id="@+id/ll_bottom"
            style="@style/LinearHorizontal"
            android:layout_marginBottom="@dimen/margin_pad_16"
            android:background="@android:color/transparent"
            android:gravity="center">

            <com.netsolace.efc.utility.customviews.widgets.CustomButton
                android:id="@+id/btn_go"
                android:layout_width="@dimen/circular_go_n_done_btn_size"
                android:layout_height="@dimen/circular_go_n_done_btn_size"
                android:background="@drawable/oval_generic"
                android:text="@string/go"
                android:textColor="@color/theme_color_gift_finder"
                android:textSize="@dimen/text_size_medium" />

        </LinearLayout>

    </LinearLayout>

    <com.netsolace.efc.utility.customviews.widgets.CustomTextView
        android:id="@+id/tv_gift_no_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="No Results"
        android:textColor="@android:color/white"
        android:textSize="@dimen/text_size_large"
        android:textStyle="bold"
        android:visibility="gone" />

</FrameLayout>

3 个答案:

答案 0 :(得分:1)

如果您考虑在中心显示单个列表项,那么我建议将另一个布局设置为layout_height并将layout_width设置为match_parent,然后设置列表项您的列表只包含一个项目。

因此,在适配器的onCreateViewHolder内,执行类似的操作

// Declare a constant named SINGLE_VIEW first, inside your Adapter
private final int SINGLE_VIEW = 1;

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View v;

    if (viewType == SINGLE_VIEW) {
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_single, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;

    } else {
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        ViewHolder vh = new ViewHolder(v);
        return vh;

    }
}

然后在getItemViewType中,你需要return正确的观点。

@Override
public int getItemViewType(int position) {
    if(position == 0 && yourList.size() == 1) return SINGLE_VIEW;
    else return super.getItemViewType(position);
}

<强>更新

如果您需要将RecyclerView放在屏幕中央,那么您需要设计这样的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:gravity="center">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/my_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</RelativeLayout>

从上面的代码中选择的重要事项是将父gravity的{​​{1}}设置为居中,并将RelativeLayout的高度设置为RecyclerView

这是我的测试应用程序截图

Here's my test application screenshot

答案 1 :(得分:0)

使用以下内容:

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

  <android.support.v7.widget.RecyclerView
    android:id="@+id/my_list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" /> 
</LinearLayout>

答案 2 :(得分:0)

您可以使用多个 viewType 设置适配器,并为单独的项目设置特殊类型,其中 layout_height="match_parent"。或者,在这种情况下,您可以通过调整其布局参数来自定义单个项目,但是您需要确保为其他项目(被回收的项目)重置它们。