水平RecyclerView与开始填充

时间:2015-12-15 17:03:11

标签: android android-layout android-recyclerview

所以我有一个ImageView作为背景,并且在它上面有一个Horizo​​ntal RecyclerView,这里的事情是我希望RecyclerView从屏幕的半填充到左边开始显示它的项目,这样你就可以完美地看到背景在开始时和滚动项目时,您将隐藏图像/背景。

注意:请查看Play商店以了解我要完成的工作。

enter image description here

所以我有这个工作:

<RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="#000052"
 android:orientation="vertical" >

       <ImageView
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:src="@drawable/trybg5"
        android:layout_gravity="left" />

              <HorizontalScrollView
               android:id="@+id/frag_home_gallery_recent_container"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:orientation="horizontal"
               android:layout_gravity="right"
               android:scrollbars="none"
               android:layout_weight="1"
               android:paddingBottom="@dimen/horizontalGallery_content_padding"
               android:paddingTop="@dimen/horizontalGallery_content_padding">


                 <LinearLayout
                  android:id="@+id/frag_home_gallery_recientes"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:orientation="horizontal"
                  android:paddingLeft="150dp" />
             </HorizontalScrollView>
    </RelativeLayout>

我的观点是以编程方式夸大Horizo​​ntalScrollView内部的布局,并且它运行良好。但随着时间的推移,我决定迁移到RecyclerView,现在没有按预期工作。

出现背景,Recycler从右侧开始半屏,但滚动时它不会滚动直到屏幕左侧,它只会隐藏设置填充的位置..

<RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:background="#000052"
 android:orientation="vertical" >

   <ImageView
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:scaleType="centerCrop"
    android:src="@drawable/trybg5"
    android:layout_gravity="left" />

          <FrameLayout
                    android:id="@+id/frag_home_gallery_recent_container"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:layout_gravity="right"
                    android:scrollbars="none"
                    android:layout_weight="1"
                    android:paddingBottom="@dimen/horizontalGallery_content_padding"
                    android:paddingTop="@dimen/horizontalGallery_content_padding">

                    <android.support.v7.widget.RecyclerView
                        android:background="@drawable/gallery_bg"
                        android:id="@+id/frag_home_gallery_recientes"
                        android:scrollbars="none"
                        android:paddingLeft="150dp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                         />

                </FrameLayout>
          </RelativeLayout>

如何知道如何在RecyclerView中使用此效果?

以下是回收商的详细信息:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:id="@+id/discoContainer"
    android:background="@drawable/gallery_bg"
    android:layout_margin="5dp"
    android:padding="2dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/containerDisco"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/logoDisco"
                android:transitionName="DiscoId"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:scaleType="centerCrop"
                android:contentDescription="LogoDisco"
                android:windowSharedElementsUseOverlay="false" />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="a 600m tuyos"
                android:padding="3dp"
                android:layout_gravity="center_horizontal"
                android:maxLines="1"
                android:gravity="center_horizontal"
                android:alpha="500"
                android:background="#46000000"
                android:textColor="@android:color/white"/>
        </RelativeLayout>

        <TextView
            android:id="@+id/logoTexto"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Probando"
            android:padding="3dp"
            android:layout_gravity="center_horizontal"
            android:maxLines="1"
            android:gravity="center_horizontal"
            android:layout_alignBottom="@+id/containerDisco" />

    </LinearLayout>


</LinearLayout>

2 个答案:

答案 0 :(得分:11)

这比这简单得多,RecyclerView已经有了这个功能:只需将android:clipToPadding="false"设置为RecyclerView XML,这样填充就不会剪掉你的项目。

所以对你的例子来说:

<android.support.v7.widget.RecyclerView
  android:background="@drawable/gallery_bg"
  android:id="@+id/frag_home_gallery_recientes"
  android:scrollbars="none"
  android:paddingLeft="150dp"
  android:clipToPadding="false"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content" />

答案 1 :(得分:10)

我通常使用ItemDecoration来实现这种效果,而不是使用填充。

public class PaddingItemDecoration extends RecyclerView.ItemDecoration {
    private final int size;

    public PaddingItemDecoration(int size) {
        this.size = size;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        // Apply offset only to first item
        if (parent.getChildAdapterPosition(view) == 0) {
            outRect.left += size;
        }
    }
}

然后当您设置RecyclerView

int size = ... // Get the offset that you want
RecyclerView recyclerView = ...

recyclerView.addItemDecoration(new PaddingItemDecoration(size));