gpt4 book ai didi

c# - Xamarin Forms ListView 程序刷新在页面加载时不会在 Android 上停止

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:55:45 24 4
gpt4 key购买 nike

我在 Visual Studio 2015 中有一个带有 ListView 的 Portable 项目,它通过以下函数 refreshData 通过 API 调用填充了一些数据:

async Task refreshData()
{
myListView.BeginRefresh();
var apiCallResult = await App.Api.myApiGetCall();
myListView.ItemsSource = apiCallResult;
myListView.EndRefresh();
}

refreshData() 被调用

protected override void OnAppearing()
{
base.OnAppearing();
refreshData();
}

一切正常,除了在 Android 上,刷新指示器在初始加载页面时不会在 EndRefresh() 上停止或消失。该页面位于 TabbedPage 中,因此我可以转到不同的选项卡,然后返回到该页面,并且刷新指示器会在我的 API 调用完成时正常启动和停止。

为什么在 Android 上最初加载页面时刷新没有停止?任何帮助将不胜感激。

注意:当我在 iOS 上运行时,这工作得很好。

到目前为止我已经尝试过:

  1. myListView.BeginRefresh() 替换为 myListView.IsRefreshing = true 并将 myListView.EndRefresh() 替换为 myListView .IsRefreshing = false

  2. 使用 Device.BeginInvokeOnMainThread(() => {//更新列表和 endRefresh})

  3. 使用 async void refreshData() 而不是 async Task refreshData()

最佳答案

就个人而言,当我在 Page Contructor 中启动 ListView 刷新并在加载数据后停止它时,我会遇到这个问题。有时(经常)Xamarin.Forms ListView 不会取消刷新动画。

我相信您在使用 Android SwipeRefreshLayout 时遇到了一个相当普遍的问题:它可能不会在 setRefreshing(false) 调用后停止刷新动画。 native Android 开发人员使用以下方法:

swipeRefreshLayout.post(new Runnable() {
@Override
public void run() {
mSwipeRefreshLayout.setRefreshing(refreshing);
}
});

有趣的是,Xamarin.Forms 在设置初始刷新状态 (code) 时使用了这种方法;然而,这还不够。您需要一个自定义渲染器:

public class ExtendedListViewRenderer : ListViewRenderer
{
/// <summary>
/// The refresh layout that wraps the native ListView.
/// </summary>
private SwipeRefreshLayout _refreshLayout;

public ExtendedListViewRenderer(Android.Content.Context context) : base(context)
{
}

protected override void Dispose(bool disposing)
{
if (disposing)
{
_refreshLayout = null;
}
base.Dispose(disposing);
}

protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
base.OnElementChanged(e);
_refreshLayout = (SwipeRefreshLayout)Control.Parent;
}

protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == ListView.IsRefreshingProperty.PropertyName)
{
// Do not call base method: we are handling it manually
UpdateIsRefreshing();
return;
}
base.OnElementPropertyChanged(sender, e);
}

/// <summary>
/// Updates SwipeRefreshLayout animation status depending on the IsRefreshing Element
/// property.
/// </summary>
protected void UpdateIsRefreshing()
{
// I'm afraid this method can be called after the ListViewRenderer is disposed
// So let's create a new reference to the SwipeRefreshLayout instance
SwipeRefreshLayout refreshLayoutInstance = _refreshLayout;

if (refreshLayoutInstance == null)
{
return;
}

bool isRefreshing = Element.IsRefreshing;
refreshLayoutInstance.Post(() =>
{
refreshLayoutInstance.Refreshing = isRefreshing;
});
}
}

关于c# - Xamarin Forms ListView 程序刷新在页面加载时不会在 Android 上停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42165245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com