2014-09-19 3 views
0

J'implémente un effet de "parallaxe" qui consiste en une vue de liste et une vue d'image ci-dessus. Lorsque l'utilisateur fait défiler vers le bas, le décalage est soustrait de la hauteur de la vue de l'image. Cela fonctionne bien. Je fais ceci dans le listener de défilement de la vue de liste. Pour vraiment mettre à jour le listview et l'imageview en temps réel je dois appeler requestLayout(). Le problème est, que cette méthode est asynchrone et si je défile lentement, elle scintille extrêmement. Si je viens de glisser rapidement, ça a l'air très bien. Y a-t-il une autre solution pour résoudre ce problème?Comment éviter les scintillements ListView lors de la demande de mise en page très souvent

ScrollListener

@Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      View c = view.getChildAt(0); 
      int top = (c == null) ? 0 : (-c.getTop() + view.getFirstVisiblePosition() * c.getHeight()); 
      //Log.d(TAG, "Offset = " + top); 
      mImageView.getLayoutParams().height = 400 - top; 
      mImageView.requestLayout(); 
     } 

Mise en page

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      tools:context="xxx.fragments.NewsFragment"> 

<ImageView 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:background="@android:color/holo_blue_light" 
    android:id="@+id/advertisement" 
    /> 

<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/news_feed"> 

</ListView> 

</TableLayout> 

enter image description here

+0

Donc, l'imageView est censé apparaître comme faisant partie de la liste, mais avec la parallaxe? Pouvez-vous donner plus de détails sur la façon dont vous semblez faire partie de la liste? – Karakuri

+0

l'ImageView n'est pas dans la liste. C'est dans le TableLayout au-dessus de la listeViewView et juste en réduisant la hauteur de l'imageView (jusqu'à ce qu'elle disparaisse) le listView se déplace dans le TableLayout. Peut-être que ce n'est pas une «vraie parallaxe», mais c'est essentiellement ce que l'on cherche presque dans l'action. Voilà comment j'ai essayé de décrire la situation – Michael

Répondre

2

Si vous voulez juste le ImageView pour faire défiler la liste, vous pouvez alors simplement add it as a header view:

listView.addHeaderView(mImageView); 

Assurez-vous d'appeler cette méthode avant d'appeler setAdapter. Assurez-vous également que votre ImageView n'a pas déjà un parent, donc gonflez-le séparément ou créez-en un en utilisant new ImageView.

+0

C'est exactement ce que je voulais accomplir .. dieu putain: D – Michael

Questions connexes