【问题标题】:ListView not updating (c#)ListView 不更新(c#)
【发布时间】:2017-11-27 09:59:36
【问题描述】:

我正在做一个简单的测试,因为我需要了解 ListView。我已经做了很多搜索,并且有很多内容,但所有这些都试图做的不仅仅是基础知识。所以为了理解这个概念,我做了一个简单的程序并在下面列出。

一切正常 - 除非我旋转手机。我知道它会破坏活动,我需要重新创建列表视图和适配器。 我不明白的是 - 为什么我的字符串列表也被“破坏”了。

看看我的例子 - 工作日将在轮换后出现。但是点击次数列表不会!! 在我的情况下使用列表视图的正确方法是什么?我不想做复杂的行视图或自定义适配器。我会从基础开始。 谢谢!

namespace NewListViewTest
{
    [Activity(Label = "NewListViewTest", MainLauncher = true)]
    public class MainActivity : Activity
    {
        Button StartScan;
        Button StopScan;
        TextView Filter;
        ListView IBeaconActivities;
        List<string> dataList;
        ArrayAdapter<string> dataAdapter;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            dataList = new List<string>();
        }

        protected override void OnStart()
        {
            base.OnStart();
            StartScan = FindViewById<Button>(Resource.Id.startScan);
            StartScan.Click += StartScan_Click;

            StopScan = FindViewById<Button>(Resource.Id.stopScan);
            Filter = FindViewById<TextView>(Resource.Id.filter);
            IBeaconActivities = FindViewById<ListView>(Resource.Id.beaconActivities);

            dataAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, dataList);
            IBeaconActivities.Adapter = dataAdapter;

            dataList.Add("Monday");
            dataList.Add("Tuesday");
            dataList.Add("Wednesday");
            dataList.Add("Thursday");
            dataList.Add("Friday");
            dataList.Add("Saturday");
            dataList.Add("Sunday");

            DataWasUpdated();
        }

        public void DataWasUpdated()
        {
            dataAdapter.Clear();
            dataAdapter.AddAll(dataList);

            dataAdapter.NotifyDataSetChanged();
        }

        private void StartScan_Click(object sender, System.EventArgs e)
        {
            dataList.Add("New item at: " + DateTime.Now.ToString("hh:mm:ss"));
            DataWasUpdated();
        }
    }
}

【问题讨论】:

  • 你试过OnResume方法吗?
  • 一周中的日子仍然存在,因为当您轮换时会调用 onStart;您需要将新项目保存在onSaveInstanceState 中。请参阅developer.android.com/guide/components/activities/…“保存和恢复活动状态”部分
  • 感谢您指出这一点。我可以看到还有很多其他有趣的东西需要学习。模型视图模型视图“东西”也很有趣。谢谢!

标签: c# android listview xamarin xamarin.android


【解决方案1】:

ListView 不更新(c#)

您可以阅读Android Activity Lifecycle 文档,当您旋转手机时,您的Activity 将被销毁并重新创建。您可以添加日志以查看更多信息,例如:

protected override void OnPause()
{
    base.OnPause();
    Log.Error(Tag, "OnPause");
}

protected override void OnResume()
{
    base.OnResume();
    Log.Error(Tag, "OnResume");
}

protected override void OnSaveInstanceState(Bundle outState)
{
    base.OnSaveInstanceState(outState);
    Log.Error(Tag, "OnSaveInstanceState");
}

protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
    base.OnRestoreInstanceState(savedInstanceState);
    Log.Error(Tag, "OnRestoreInstanceState");
}

protected override void OnDestroy()
{
    base.OnDestroy();
    Log.Error(Tag, "OnDestroy");
}

......

旋转手机时,您会看到以下信息:

这就是你的ListView 将被销毁的原因。

解决办法:

Activity 中添加ConfigurationChanges 属性:

[Activity(Label = "ListActivity", 
    ConfigurationChanges = Android.Content.PM.ConfigChanges.Orientation | Android.Content.PM.ConfigChanges.ScreenSize)]
public class ListActivity : Activity

然后,当您旋转手机时,只执行OnConfigurationChanged 方法:

E/Activity (17410): OnConfigurationChanged

您的Activity 不会被创建,您的New item 仍然存在。

【讨论】:

  • 它可以解决问题,所以我将您的答案标记为解决方案。您输入一些背景信息而不是简单地提供答案也很好。谢谢!
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 2014-09-24
  • 2020-09-10
  • 1970-01-01
  • 2015-07-08
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多