8

我有一個顯然可以滾動的列表視圖。列表視圖包含一些表單問題。一旦用戶提交表單,我們會在列表視圖的頂部添加一個類似郵票的自定義視圖(並阻止用戶回答問題,但這裏無關緊要)。Android:使列表視圖與列表視圖一起瀏覽

郵票應該出現在列表視圖的頂部(如屏幕頂部),並且可以以與列表視圖相同的速度滾動,即當列表視圖中最初位於其下方的項目消失時,它應該消失滾動時的屏幕。

任何想法如何實現這一目標?

回答

6

我找到了解決辦法。不知道它是否太優雅,但它的工作原理將使它離開它,除非有人想出更好的東西。

我想與列表一起滾動的視圖是一個自定義視圖,它必須知道列表視圖。所以,我實現setListView(ListView控件ListView控件)方法就可以了:

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

評論一:這讓我跟蹤當前的滾動位置的變量。

評論二:設置一個新的滾動監聽器,讓我的自定義視圖知道什麼時候該列表

評論三:這並不需要在這種情況下實施。

評論No.4:這是魔術發生的地方。最後注意我通過scrollY - oldScrollY來滾動我的視圖,讓我先從這個位開始。 oldScrollY是保存的滾動位置,scrollY是新的。我需要滾動他們之間的差異。至於scrollY是如何計算的,請參考我的答案:Android getting exact scroll position in ListView,它是如何在列表視圖中計算滾動位置的。

5

頂級屏幕的查看您可以添加headerview所以綁定coustom佈局的listview..so你已經滾動相同的ListView headerlayout ...

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

嗨,謝謝你的回答。我需要列表視圖中的頂部行'加蓋',所以我不能將該視圖放在標題中。 – Maria

+0

你可以通過創建兩個自定義佈局和第一positon.bind所有休息的第一佈局和第二佈局acheving ..所以你必須在數組中添加必要的值在baseadapter –

+0

綁定事情是我沒有必要希望郵票出現在第一個位置上方。在我的列表中,行高可能不同,郵票可能會在前三個左右。 – Maria