【问题标题】:Xamarin.Android how to auto update RecyclerViewXamarin.Android 如何自动更新 RecyclerView
【发布时间】:2017-05-25 03:15:52
【问题描述】:

this 文章之后,我创建了一个显示列表的简单应用程序。我从 Web 服务(.asmx Web 服务)获得的列表。

我想每 5 秒自动更新一次RecyclerView,但我不知道该怎么做。

在 WinForms 中我会使用 Timer 组件,但我不知道它在 Xamarin 中是如何工作的。

MainActivity.cs

[Activity(Label = "CibMonitor", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : AppCompatActivity
    {
        RecyclerView recyclerView;
        RecyclerView.LayoutManager layoutManager;
        ConnectionItemsAdapter adapter;
        ConnectionItem[] connectionItems;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);

            var ci = new ConnectionItem();

            //Get list from web service
            connectionItems = ci.GetList().ToArray();

            //Setup RecyclerView
            adapter = new ConnectionItemsAdapter(this, connectionItems);

            recyclerView = FindViewById<RecyclerView>(Resource.Id.recyclerView);

            recyclerView.SetAdapter(adapter);

            ChangedData();
        }
    }

更新 我按照 York Shen 的建议在活动课上创建了新方法

void ChangedData()
{
    Task.Delay(5000).ContinueWith(t =>
    {
        var newData = ConnectionItem.GetList();
        adapter.RefreshItems(newData);
        ChangedData();
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

这是我在适配器类中的更新方法:

public void RefreshItems(List<ConnectionItem> newItems)
{
    items.Clear();
    items = newItems;
    NotifyDataSetChanged();
}

我的应用停止工作,没有例外只有这条消息:

【问题讨论】:

  • 我在适配器中尝试了notifyDataSetChanged() 方法,但没有成功
  • 我会为您的任务使用Handler
  • this 处理程序?你能展示一下如何用c#写这个吗?
  • 一点点谷歌搜索就可以了。相信我,这很容易。搜索android handler xamarin
  • 对不起,这似乎是一个ANR,你不能在主线程中做太多的工作。你能分享一个关于这个的演示吗?我不知道你在主线程中做了什么。

标签: c# android xamarin.android


【解决方案1】:

您可以创建一个Task,它可以帮助您每 5 秒更新一次 recyclerView:

void ChangedData()
    {
        Task.Delay(5000).ContinueWith(t =>
        {
           adapter.NotifyDataSetChanged();
           ChangedData();//This is for repeate every 5s.
        }, TaskScheduler.FromCurrentSynchronizationContext());
    }

编辑:

抱歉回复晚了,拨打Task.Delay()中的ChangedData()可以解决重复问题。您可以在OnCreate() 方法中使用invoke ChangedData()。希望这可以帮到你。 :)

【讨论】:

  • 我需要在OnCreate()方法中调用ChangedData()方法吗?
  • ChangedData() 只执行一次,我的应用程序冻结,我收到消息 Myapp isn't responding do you want to close it
  • @user3373603,对不起,我已经在我的答案中添加了解决方案。 :)
猜你喜欢
  • 2021-11-07
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多