8

J'ai un listview qui est évidemment défilable. La listview contient des questions de forme. Une fois que l'utilisateur a soumis le formulaire, nous avons placé une vue personnalisée ressemblant à un timbre sur le listview (et empêchant l'utilisateur de répondre aux questions, mais cela n'a pas d'importance ici). Le tampon devrait apparaître en haut de la liste (comme en haut de l'écran) et être défilable à la même vitesse que la liste, c'est-à-dire qu'il devrait disparaître lorsque les éléments listview qui étaient initialement en dessous disparaissent en haut de l'écran lors du défilement.Android: Afficher en haut de la liste déroulante défiler avec le listview

Une idée de comment y parvenir?

Répondre

6

je trouve une solution. Je ne sais pas si c'est trop élégant, mais ça marche, ça va partir, à moins que quelqu'un ne trouve quelque chose de mieux.

La vue que je veux faire défiler avec la liste est une vue personnalisée, qui doit connaître l'affichage de la liste. Donc, je mets en œuvre une setListView (ListView listView) Méthode sur elle:

private int scrollY; //1 
private Map<Integer, Integer> listViewItemHeights = new Hashtable<>(); 
public void setListView(final ListView listView) { 
    listView.setOnScrollListener(new OnScrollListener() { //2 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) {} //3 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4 
      View c = listView.getChildAt(0); 
      if (c != null) { 
       int oldScrollY = scrollY; 
       scrollY = -c.getTop(); 

       listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight()); 
       for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) { 
        if (listViewItemHeights.get(i) != null) 
         scrollY += listViewItemHeights.get(i); 
       } 
       scrollBy(0, scrollY - oldScrollY); 
      } 
     } 
    }); 
} 

Commentaire n ° 1: ceci est une variable me permettant de garder la trace de la position actuelle du défilement.

Commentaire n ° 2: la fixation d'un nouveau sur écoute de défilement pour laisser mon point de vue personnalisé savoir quand la liste

Commentaire n ° 3: il n'a pas besoin d'être mis en œuvre dans ce cas.

Commentaire n ° 4: c'est là que la magie se produit. Notez à la fin je défile ma vue par scrollY - oldScrollY, laissez-moi commencer par ce bit en premier. oldScrollY est la position de défilement maintenue, scrollY est la nouvelle. J'ai besoin de faire défiler la différence entre eux. En ce qui concerne la façon dont scrollY est calculé, je vous renvoie à ma réponse ici: Android getting exact scroll position in ListView, c'est ainsi que la position de défilement est calculée en vue liste.

5

pour la vue de l'écran haut, vous pouvez ajouter headerview donc lier la mise en page de Coustom comme headerlayout de listview..so vous faites défiler même que listview ...

View headerview = ((LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.track_footer_view, null, false); 
    listview.addHeaderView(headerview); 
+0

Salut, merci pour votre réponse. J'ai besoin que les lignes du haut de la liste soient marquées, donc je ne peux pas mettre cette vue dans l'en-tête. – Maria

+0

vous pouvez réaliser par la création de deux mise en page personnalisée et pour un premier positon.bind première mise en page et deuxième mise en page pour tout repos .. de sorte que vous devez ajouter valus nécessaire dans ce tableau que vous lier dans baseadapter –

+0

La chose est que je ne suis pas nécessaire veulent que le timbre apparaisse au-dessus de la première position. Les hauteurs des rangées peuvent être différentes dans ma liste et le timbre peut traverser les trois premiers. – Maria

Questions connexes