8

Mam listę, która jest oczywiście przewijalna. Listview zawiera pytania dotyczące niektórych formularzy. Gdy użytkownik przesyła formularz, umieszczamy niestandardowy wygląd przypominający znaczek na szczycie listy (i uniemożliwia użytkownikowi odpowiadanie na pytania, ale nie ma to znaczenia).Android: Zrób widok przewijania listview wraz z listview.

Znaczek powinien pojawić się u góry listy (jak na górze ekranu) i być przewijany z taką samą szybkością, jak widok listy, tzn. Powinien zniknąć, gdy elementy listy, które znajdowały się pod nim, zniknęły na górze ekranu po przewinięciu.

Każdy pomysł, jak to osiągnąć?

Odpowiedz

6

znalazłem rozwiązanie. Nie jestem pewna, czy to zbyt eleganckie, ale działa tak, że odejdzie, chyba że ktoś wymyśli coś lepszego.

Widok, który chcę przewijać razem z listą, jest widokiem niestandardowym, który musi wiedzieć o widoku listy. Więc wdrożyć setListView (ListView ListView) metodę na nim:

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

Komentarz nr 1: jest to zmienna pozwala mi śledzić aktualną pozycję przewijania.

Komentarz No.2: ustawienie na nowy przewijania słuchacza niech mój zwyczaj widok wiedzieć, kiedy lista

Komentarz No.3: to nie musi być realizowane w tym przypadku.

Komentarz nr 4: tutaj dzieje się magia. Uwaga na końcu przewijam mój widok scrollY - oldScrollY, zacznij od tego pierwszego. oldScrollY to utrzymana pozycja przewijania, scrollY to nowa. Muszę przewijać różnicę między nimi. Jeśli chodzi o sposób obliczania scrollY, odsyłam do mojej odpowiedzi tutaj: Android getting exact scroll position in ListView, tak obliczana jest pozycja przewijania w widoku listy.

5

Widok na górnym ekranie można dodać headerview więc powiązania układu coustom jako headerlayout z listview..so masz takie same jak przewijać ListView ...

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

Witam, dziękuję za odpowiedź. Potrzebuję górnych wierszy w liście do "wytłoczenia", więc nie mogę umieścić tego widoku w nagłówku. – Maria

+0

możesz zgłębić, tworząc dwa niestandardowe układy i pierwszy pierwszy układ położeń i drugi układ dla całego spoczynku. Tak więc musisz dodać konieczną wartość w tablicy, co wiążesz w baseadapter –

+0

Chodzi o to, że nie potrzebuję chcesz, aby znaczek pojawił się na pierwszej pozycji. Wysokość wierszy może być inna na mojej liście, a znaczek może przekroczyć pierwsze trzy lub więcej. – Maria