2017-06-23 1 views
-3

J'ai un RecyclerView horizontal et un ImageView qui se trouve sous ce RecyclerViewRecyclerView + ImageView défilement

Voici le code XML correspondant:

<android.support.v7.widget.RecyclerView 
    android:id="@+id/my_rv" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/upArrow"> 

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

<!-- TODO: This view should be part of the recyclerview scroll, we should find a solution for this --> 
<ImageView 
    android:id="@+id/upArrow" 
    android:layout_marginTop="6dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/ic_my_up_triangle_vector" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" /> 

je voudrais obtenir l'effet défilement suivant:

Lorsqu'il y a une tentative de faire défiler le RecyclerView et/ou le ImageView en dessous, le RecyclerView défilera en conséquence, et l'imagev View restera à son emplacement d'origine. En fait ce que je suis en train de réaliser est d'étendre les limites de défilement RecyclerView pour inclure toutes les hauteur de la Imageview

Je pensais à la fixation d'un ScrollView qui enveloppe ces deux points de vue, mais je ne suis pas vraiment sûr de ce qu'il faut faire puis.

Répondre

1

Dans votre fichier xml

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_width="match_parent"> 

<!-- TODO: This view should be part of the recyclerview scroll, we should find a solution for this --> 
<ImageView 
    android:id="@+id/upArrow" 
    android:layout_width="wrap_content" 
    android:layout_height="40dp" 
    android:src="@drawable/ic_my_up_triangle_vector" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" /> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/my_rv" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true" 
    android:paddingBottom="40dp"> 

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

</RelativeLayout> 

Qu'est-ce que ce code fait est-il votre place RecyclerView au-dessus de votre ImageView et le rembourrage en bas est utilisé pour afficher l'image en bas. Changez la Hauteur de l'ImageView et du Padding de RecyclerView en conséquence.

+0

C'est la bonne réponse, merci! – idish

+0

@idish vous êtes les bienvenus, heureux que je puisse vous aider –

0

Vous avez déjà reçu des votes négatifs dans votre question. Je suppose que ce sont pour votre question qui n'est pas vraiment claire et la solution que vous essayez d'atteindre n'est pas la bonne façon de le faire aussi. De votre code de la mise en page, j'ai compris que vous avez besoin d'un bouton fléché vers le haut qui fera défiler vers le haut de la RecyclerView lorsque vous avez cliqué dessus et que vous voulez que le bouton reste au bas de la page Vous voulez que votre RecyclerView défile comme il est et le bouton fléché pour rester où il est. Si c'est votre cas, vous devez repenser la disposition et la conception du flux Activity. Vous devez faire le RecyclerView et le bouton fléché complètement disjoint. Donc, selon mon hypothèse sur votre question, vous avez besoin d'un Activity qui contient un bouton d'action flottante et qui contient un Fragment. Le Fragment aura le RecyclerView faisant le bouton d'action flottante (pour la flèche vers le haut) et le RecyclerView complètement disjoint.

Vous devez donc avoir un Activity et la disposition du Activity devrait ressembler à ceci.

<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"> 

    <RelativeLayout 
     android:id="@+id/fragment_container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/fab_up" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_margin="@dimen/activity_horizontal_margin" 
     android:src="@drawable/ic_up_arrow" 
     app:backgroundTint="@color/colorPrimary" 
     app:borderWidth="0dp" 
     app:elevation="4dp" 
     app:fabSize="normal" /> 

</RelativeLayout> 

Et devrait ressembler à la fonction onCreate du Activity cela.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_layout); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    mFabUpArrow = (FloatingActionButton) findViewById(R.id.fab_up); 
    mFabUpArrow.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      jumpToTopOfTheRecyclerView(); 
     } 
    }); 

    // Now launch the Fragment from here. 
    getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RecyclerViewFragment()).commit(); 
} 

Maintenant, le RecyclerViewFragment devrait avoir la mise en page suivante tenant le RecyclerView

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

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

</RelativeLayout> 

Et je pense que vous savez déjà comment remplir votre RecyclerView et faire cette chose dans votre Fragment.

Vous demandez peut-être comment implémenter la fonction jumpToTopOfTheRecyclerView() dans le Activity. C'est simple et vous avez plusieurs options.Une approche pourrait être d'avoir un BroadcastReceiver dans votre Fragment et l'envoi de la diffusion de votre Activity ce qui n'est pas une bonne approche. Vous trouverez peut-être quelque chose de très simple de communiquer entre votre Activity et votre Fragment. Bonne chance.

0

Vous pouvez simplement placer votre tête et votre RecyclerView dans un NestedScrollView:

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     > 
     <android.support.v7.widget.RecyclerView 
      android:id="@+id/my_rv" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_above="@+id/upArrow"> 

     </android.support.v7.widget.RecyclerView> 
     <ImageView 
      android:id="@+id/upArrow" 
      android:layout_marginTop="6dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:src="@drawable/ic_my_up_triangle_vector" 
      android:layout_alignParentBottom="true" 
      android:layout_centerHorizontal="true" /> 

    </LinearLayout> 

</android.support.v4.widget.NestedScrollView> 

et dans le code Java font mRecyclerView.setNestedScrollingEnabled (false); faire défiler correctement crédits check this anser