2016-03-01 15 views
8

Scrollen ich versuche, eine Suchleiste zu implementieren, wie in Google Maps Android App:Android Symbolleiste Höhen wenn

enter image description here

Wenn die Recycler Ansicht in seinem Ausgangszustand ist, hat die Symbolleiste keine Höhe. Erst wenn der Benutzer mit dem Scrollen beginnt, wird die Höhe sichtbar. Und die Suchleiste (Symbolleiste) bricht nie zusammen. Hier ist, was ich versuchte, dies zu wiederholen:

<android.support.design.widget.CoordinatorLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

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

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="64dp"> 

      <!-- content --> 

     </android.support.v7.widget.Toolbar> 

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

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

Und hier können Sie das Ergebnis sehen:

enter image description here

Also das Problem mit meiner Lösung ist, dass die Höhe der Symbolleiste ist immer sichtbar . Aber ich möchte, dass es nur angezeigt wird, wenn die Recycleransicht dahinter scrollt. Gibt es etwas aus der Design-Support-Bibliothek, das ein solches Verhalten ermöglicht, wie es in der Google Maps App zu sehen ist?

I

com.android.support:appcompat-v7:23.2.0 
com.android.support:design:23.2.0 
+0

Haben Sie versucht, CollapsingToolbarLayout zu verwenden? –

Antwort

13

Ob Sie ein CoordinatorLayout verwenden oder nicht, ein RecyclerView.OnScrollListener scheint die richtige Art und Weise, so weit zu gehen, wie die Erhebung betrifft. Aus meiner Erfahrung recyclerview.getChild(0).getTop() ist jedoch nicht zuverlässig und sollte nicht verwendet werden, um den Scroll-Status zu bestimmen. Stattdessen ist es das, was funktioniert:

private static final int SCROLL_DIRECTION_UP = -1; 
// ... 
// Put this into your RecyclerView.OnScrollListener > onScrolled() method 
if (recyclerview.canScrollVertically(SCROLL_DIRECTION_UP) { 
    // Remove elevation 
} else { 
    // Show elevation 
} 

Seien Sie sicher, einen Absturz verursachen kann ein LayoutManager zu Ihrem RecyclerView oder der Aufruf von canScrollVertically zuweisen!

+1

@DanielVeihelmann vielen Dank das perfekt mein Problem löst. –

3

bin mit habe ich ein RecyclerView in meinem Fragment. Ich könnte einen ähnlichen Effekt mit dem folgenden Code erreichen:

Es ist nicht der intelligenteste Weg und Sie können auf bessere Antworten warten.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    // Initial Elevation 
    final Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); 
    if(toolbar!= null) 
     toolbar.setElevation(0); 

    // get initial position 
    final int initialTopPosition = mRecyclerView.getTop(); 

    // Set a listener to scroll view 
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
      super.onScrollStateChanged(recyclerView, newState); 
     } 

     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      if(toolbar!= null && mRecyclerView.getChildAt(0).getTop() < initialTopPosition) { 
       toolbar.setElevation(50); 
      } else { 
       toolbar.setElevation(0); 
      } 
     } 
    }); 
} 
+0

sieht gut aus, danke. Du denkst das ist mit nur xml nicht möglich? –

+0

Ich denke, dass es nur durch XML nicht möglich ist. DefaultBahevior für die Symbolleiste bezieht sich nicht auf Höhe (aber zu seiner Höhe). Selbst wenn Sie einen Weg finden, CoordinatorLayout zu verwenden, denke ich, dass Sie etwas Code benötigen ... Ich werde versuchen, denselben Effekt zu erzielen, indem ich nur CoordinatorLayout verwende. Ich werde so schnell wie möglich teilen – W0rmH0le

+0

Fast perfekt, 'canScrollVertically' ist was Sie suchen in Ihrem OnScrollListener (siehe meine Antwort). Außerdem, einfach zurückgeben, wenn "toolbar == null" vor dem Aufruf von addOnScrollListener() würde Ihren Code ein wenig besser IMHO machen. –

Verwandte Themen