2015-07-11 2 views
1

Я использовал recyclerview во фрагменте. Если переменная конфигурации Activity включает ориентацию, просмотр ресайклера появляется посередине экрана после изменения ориентации телефона от пейзажа к портрету. Однако он всегда должен быть сверху. Если configChanges не включает ориентацию, он всегда отображается сверху при изменении ориентации.RecyclerView находится в середине вместо вершины после изменения ориентации от пейзажа к портрету

Вы не знаете, в чем причина?

Это расположение активность

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    tools:context="com.butterfly.LoginActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

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


    <FrameLayout 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     android:id="@+id/butterflypi_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="top|start" /> 


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

Это расположение фрагмент заменяет framelayout выше.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="8dp" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    tools:context="com.butterfly.fragment.ButterflyPIsFragment"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/my_pi_recycler_view" 
     android:scrollbars="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 

     /> 
</RelativeLayout> 

ответ

4

Я нашел решение here.

В основном вы создаете свой собственный класс поведения:

public class PatchedScrollingViewBehavior extends AppBarLayout.ScrollingViewBehavior { 

    public PatchedScrollingViewBehavior() { 
     super(); 
    } 

    public PatchedScrollingViewBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean onMeasureChild(CoordinatorLayout parent, View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { 
     if (child.getLayoutParams().height == -1) { 
      List dependencies = parent.getDependencies(child); 
      if (dependencies.isEmpty()) { 
       return false; 
      } 

      AppBarLayout appBar = findFirstAppBarLayout(dependencies); 
      if (appBar != null && ViewCompat.isLaidOut(appBar)) { 
       if (ViewCompat.getFitsSystemWindows(appBar)) { 
        ViewCompat.setFitsSystemWindows(child, true); 
       } 

       int scrollRange = appBar.getTotalScrollRange(); 
//    int height = parent.getHeight() - appBar.getMeasuredHeight() + scrollRange; 
       int parentHeight = View.MeasureSpec.getSize(parentHeightMeasureSpec); 
       int height = parentHeight - appBar.getMeasuredHeight() + scrollRange; 
       int heightMeasureSpec = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.AT_MOST); 
       parent.onMeasureChild(child, parentWidthMeasureSpec, widthUsed, heightMeasureSpec, heightUsed); 
       return true; 
      } 
     } 

     return false; 
    } 


    private static AppBarLayout findFirstAppBarLayout(List<View> views) { 
     int i = 0; 

     for (int z = views.size(); i < z; ++i) { 
      View view = (View) views.get(i); 
      if (view instanceof AppBarLayout) { 
       return (AppBarLayout) view; 
      } 
     } 

     return null; 
    } 
} 

и изменение приложения: layout_behavior в вашем FrameLayout:

<FrameLayout 
     app:layout_behavior="your_package.PatchedScrollingViewBehavior" 
     android:id="@+id/butterflypi_fragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="top|start" /> 

UPDATE: Как я только что проверил - этот вопрос был зафиксирован в 22.2.1, так что, пожалуйста, обновите библиотеку, если вы все еще используете 22.2.0

+0

Спасибо, что сработало для меня .. – TdSoft

0

Возможно, вы сможете достичь желаемого красным эффектом, создавая расположение PORTRAIT и LANDSCAPE, как в demo here. Взгляните на прикрепленный клип, если это поведение, которое вы желаете.

Смежные вопросы

 Смежные вопросы