8

Ich habe eine Listview, die offensichtlich scrollbaren ist. Die Listenansicht enthält einige Formularfragen. Sobald der Benutzer das Formular abschickt, setzen wir eine stempelähnliche benutzerdefinierte Ansicht auf die Listenansicht (und verhindern, dass der Benutzer Fragen beantwortet, aber das spielt hier keine Rolle).Android: Machen Sie Blick auf der Listenansicht blättern zusammen mit dem Listview

Der Stempel sollte oben in der Listenansicht erscheinen (wie oben auf dem Bildschirm) und mit der gleichen Geschwindigkeit wie die Listenansicht gescrollt werden, dh er sollte verschwinden, wenn die darunter liegenden Listenansichtselemente oben verschwinden des Bildschirms beim Scrollen.

Irgendeine Idee, wie man das erreicht?

Antwort

6

fand ich eine Lösung. Nicht sicher, ob es zu elegant ist, aber es funktioniert so wird es verlassen, wenn jemand mit etwas besser kommt.

Die Ansicht, die ich zusammen mit der Liste blättern will, ist eine benutzerdefinierte Ansicht, die über die Listenansicht wissen hat. So implementieren ich eine setListView (Listview Listview) -Methode darauf:

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); 
      } 
     } 
    }); 
} 

Kommentar No.1: dies ist eine Variable mir Spur der aktuellen Scroll-Position halten zu lassen.

Kommentar Nr.2: eine neue auf Scroll Listenereinstellung kennen meine benutzerdefinierte Ansicht zu lassen, wenn die Liste

Kommentar No.3: dies in diesem Fall umgesetzt werden nicht benötigt.

Kommentar No.4: das ist, wo Magie passiert. Beachten Sie am Ende ich scroll meine Sicht von ScrollY - oldScrollY, lassen Sie mich mit diesem Bit zuerst beginnen. oldScrollY ist die gehaltene Bildlaufposition, scrollY ist die neue Bildlaufposition. Ich muss nach dem Unterschied zwischen ihnen scrollen. Wie scrollY berechnet wird, verweise ich hier auf meine Antwort: Android getting exact scroll position in ListView, so wird die Scroll-Position in der Listenansicht berechnet.

5

für Ansicht des oberen Bildschirm Sie headerview so binden coustom Layout als headerlayout von listview..so Sie als Listenansicht haben blättern gleiche hinzufügen ...

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

Hallo, danke für deine Antwort. Ich brauche die obersten Zeilen in der Listenansicht, um 'gestempelt' zu werden, also kann ich diese Ansicht nicht in die Kopfzeile einfügen. – Maria

+0

Sie durch die Schaffung von zwei benutzerdefinierten Layout und für ein erstes positon.bind erstes Layout und zweites Layout für all übrigen acheving können .. so müssen Sie die notwendigen valus in Array hinzufügen, was Sie in baseadapter binden –

+0

Die Sache ist, ich nicht nötig tun möchte, dass der Stempel über der ersten Position erscheint. Zeilenhöhen können in meiner Liste unterschiedlich sein und der Stempel kann über die ersten drei oder so gehen. – Maria