2017-10-05 60 views
1

現狀Xamarin的形式通過點擊標籤頁頂欄滾動的ListView這是一個標籤頁內的頂部

我已經做了xamarin形式的跨平臺應用程序,它有一個標籤頁與無限滾動的ListView 。 每當最後一個項目出現時,listView都會以10個項目的增量填充。

的正常行爲

通常,當我們輕點選項卡頁面的最上面一欄的第一次(如果我們沒有在那一刻查看選項卡)(包含標籤頁的標題欄),該應用程序將切換到查看該頁面。這很好。

當我們點擊第二次頂欄(攻的當前瀏覽標籤頁面的最上面一欄時),沒有任何反應(不像Twitter的,U可以點擊滾動到頂部)

我的問題

我希望能夠讓listView在頂部欄被點擊時(例如twitter在其android應用程序中的做法)滾動回頂部(到列表中的第一個項目),同時仍然保持所有已經加載了我的listView中的項目。

關於如何使頂部欄響應水龍頭滾動listView返回頂部的任何想法?

回答

0

的TabbedPage暴露了CurrentPageChanged事件(或者你可以重寫OnCurrentPageChanged)將觸發只有當所選標籤的變化,所以如果你想在用戶改變標籤頁時滾動,你需要訂閱。似乎並不需要這樣做,但以防萬一...

Xamarin.Forms沒有內置事件,當第二次選擇已經選擇的選項卡時觸發。不過,通過繼承Xamarin的TabbedPage渲染器,您可以使用自定義渲染器來實現這一點。我寫了它here,並有一個適用於iOS,Android和UWP here的Xamarin.Forms解決方案。

你沒有提及平臺,所以假設你想要iOS和Android,核心位在下面。

iOS的自定義渲染

public class MainTabPageRenderer : TabbedRenderer 
{ 
    private UIKit.UITabBarItem _prevItem; 

    public override void ViewDidAppear(bool animated) 
    { 
     base.ViewDidAppear(animated); 

     if (SelectedIndex < TabBar.Items.Length) 
      _prevItem = TabBar.Items[SelectedIndex]; 
    } 

    public override void ItemSelected(UIKit.UITabBar tabbar, 
             UIKit.UITabBarItem item) 
    { 
     if (_prevItem == item && Element is MainPage) 
     { 
      // the same tab was selected a second time, so do something 
     } 
     _prevItem = item; 
    } 
} 

Android的自定義渲染

public class MainTabPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener 
{ 
    void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab) 
    { 
     if (Element is MainPage) 
     { 
      // the same tab was selected a second time, so do something 
     } 
    } 
} 

一旦你捕獲的事件,使用ListView.ScrollTo方法來滾動到頂部。

0

你應該嘗試這樣滾動起來

ListViewName.ScrollTo(yourobject,ScrollToPosition.Start, true); 
// true means boolean for animated. 

我希望這可以幫助您

+0

謝謝,這有些幫助,我主要關心的是如何讓頂欄執行該代碼時,單擊它。我不知道哪個事件或哪裏實現你的代碼行,(我對Xamarin Forms還是很新的)。試圖搜索整個互聯網,但沒有運氣與這種特殊情況。 –

+0

如果您使用的是代碼,您需要將該代碼片段插入到您的事件處理程序中。如果你使用MVVM,我會建議使用命令來綁定它。您可以創建工具欄按鈕,以便當用戶單擊「向上滾動」按鈕時,該列表視圖滾動位置將被觸發。我希望它能幫助你 –