RecyclerView在屏幕上更改位置

时间:2016-07-19 14:27:53

标签: android android-recyclerview

我对RecyclerView有疑问。 我希望通过

滚动recyclelerView时在屏幕上更改小部件位置
onScrolled(RecyclerView recyclerView, int dx, int dy) 

方法

在此方法中,我通过更改LayoutParams来更改另一个窗口小部件位置。但是,当我慢慢滚动时,我会感到颤抖。

当我更改另一个可以自由空间拉伸RecyclerView的视图的位置时,RecyclerView具有match_parent高度。

拉伸时如何解决RecyclerView的颤抖?

layout

1 个答案:

答案 0 :(得分:1)

动态更改RecyclerView的高度似乎是反模式。

我建议你使用paddingTop和clipToPadding =" false"。

你的布局xml可能是这样的:

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"/>

    <FrameLayout
            android:id="@+id/header_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

        ... here is same layout, samll text and "STARTEN" button.

    </FrameLayout>

</FrameLayout>

您的java程序可能是这样的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    final View headerContainer = findViewById(R.id.header_container);
    final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    ... initialization of recyclerView ...

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            //change height of headerContainer
        }
    });

    // set paddingTop of RecyclerView
    headerContainer.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                        headerContainer.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    } else {
                        headerContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }

                    recyclerView.setPadding(
                            recyclerView.getPaddingLeft(),
                            headerContainer.getHeight(),
                            recyclerView.getPaddingRight(),
                            recyclerView.getPaddingBottom()
                    );
                }
            });
}