5

Ich versuche, RelativeLayout zu erstellen, die CoordinatorLayout und LinearLayout im unteren Bereich hat und einige seltsame Verhalten gefunden, die ich nicht lösen kann. Das ist mein LayoutRecycleview in coordinatorlayout

<?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" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.CoordinatorLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/sender" 
     android:background="@android:color/white" 
     android:fitsSystemWindows="true"> 

     <android.support.design.widget.AppBarLayout 
      android:id="@+id/appbar" 
      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="?actionBarSize" 
       android:background="?colorPrimary" 
       app:layout_scrollFlags="scroll|enterAlways" /> 

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

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/messages_list" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

    <LinearLayout 
     android:id="@+id/sender" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:gravity="center_vertical" 
     android:background="@android:color/white"> 

     <EditText 
      android:id="@+id/inputText" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="1" 
      android:inputType="text" /> 

     <Button 
      android:fontFamily="sans-serif" 
      style="?android:attr/borderlessButtonStyle" 
      android:textAppearance="?android:textAppearanceButton" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/send" 
      android:textColor="?colorPrimary" 
      android:id="@+id/send"/> 

    </LinearLayout> 

</RelativeLayout> 

Nachdem die Daten in Adapter zu ändern Ich versuche zum letzten Elemente zu bewegen (zum Beispiel durch recyclerView.smoothScrollToPosition (Größe);) und alles, was ich sehe, ist Teil der letzten Ansicht (nicht in voller Größe). Wenn recycleview nicht mit CoordinatorLayout verschachtelt ist - alles funktioniert wie erwartet - sehe ich die letzte Elementansicht in voller Größe. Wie kann ich das Layout so ändern, dass es korrekt funktioniert?

+0

sein Was ist die Erwartung und was nicht funktioniert ..? – Psypher

+0

Ich erwarte, dass nach dem Scrollen zur letzten Position sehe ich letzte Ansicht nicht geschnitten. Im Moment sehe ich nur einen Teil der Ansicht (es scheint, als ob es nicht bis zum Ende der letzten Ansicht gescrollt wurde - nur ein sehr kleiner Teil der Ansicht ist sichtbar). Wenn recycleview aus CoordinatorLayout heraus bewegt wird, funktioniert alles korrekt - scrollToPosition funktioniert so wie ich es erwarte - letzte Ansicht sichtbar, ohne etwas zu schneiden. Aber ich hoffe, es wird das gleiche Verhalten in CoordinatorLayout zu – dmtrlbdv

+0

Entschuldigung, vergessen, hinzuzufügen. Ich benutze LinearLayoutManager und com.android.support:design:22.2.0 – dmtrlbdv

Antwort

0

im Code app:layout_scrollFlags="scroll|enterAlways" von Toolbar entfernen und stattdessen fügen Sie AppBarLayout so sollte es so

<android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:layout_scrollFlags="scroll|enterAlways"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?actionBarSize" 
      android:background="?colorPrimary"/> 

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

Versuchen Sie, diese Art und Weise: layout_marginBottom auf Ihre Aktivität

0

Das letzte Element ist abgeschnitten, weil die RecyclerView auf dem Bildschirm nicht vollständig sichtbar ist:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="16dp"> 

Der wichtigste Punkt Android zu verwenden ist hinzuzufügen. Es wird von der erweiterten AppBar nach unten geschoben. Beachten Sie, dass die AppBar beim manuellen Scrollen schrumpft, wenn Sie das letzte Element erreichen.

Was ist das Beste in meinem Fall arbeitete, war einfach die AppBar kollabieren, bevor Scrollen:

AppBarLayout appBarLayout = (AppBarLayout) getActivity().findViewById(R.id.appbar); 
appBarLayout.setExpanded(false, false); 
recyclerView.smoothScrollToPosition(position); 

ich denke, Sie auf diese Lösung nur durch Kollabieren es verbessern könnte, wenn nötig.

Wenn das Zusammenklappen der AppBar nicht gewünscht ist, können Sie die untere Auffüllung derselben Höhe wie die erweiterte AppBar hinzufügen. Allerdings wird es noch andere Störungen sein (zB bei einer Position Scrollen, die bereits im RecyclerView, aber nur außerhalb des Bildschirms)

0

Ausgabe scheint zu sein, dass smoothScrollToPosition() leise RecyclerView scrollt CoordinatorLayout über die Scroll zu sein, ohne dass geschah . Das ist, was mir eingefallen ist. Eine nette Sache ist, dass es nur scrollen sollte AppBarLayout, wenn Sie genug Elemente in Adapter haben.

final AppBarLayout layout = (AppBarLayout) findViewById(R.id.appbar); 
    layout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { 
     @Override 
     public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { 
      lastVerticalOffset = verticalOffset; 
     } 
    }); 
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 
      if (tryCollapseAppbarOnNextScroll && lastVerticalOffset != -layout.getTotalScrollRange()) { 
       layout.setExpanded(false); 
       tryCollapseAppbarOnNextScroll = false; 
      } 
     } 
    }); 

Nun, wenn Sie eine Nachricht senden, dies zu tun:

tryCollapseAppbarOnNextScroll = true; 
recyclerView.smoothScrollToPosition(adapter.getItemCount()-1); 
Verwandte Themen