Xamarin ListView更新异常:数据变更但界面未刷新求助
解决Xamarin ListView项点击后不更新显示的问题
我帮你排查了下代码,问题根源在于你用数组作为ArrayAdapter的数据源!虽然你修改了数组里的元素,也调用了NotifyDataSetChanged(),但ArrayAdapter对数组的处理是一次性读取初始内容,它不会监测数组内部元素的变化——毕竟数组的引用没改,Adapter就觉得数据源没变化,自然不会更新ListView的显示。
给你两个解决思路,推荐第一个:
方法一:把数组换成List(最稳妥)
List是动态集合,更适配ArrayAdapter的更新逻辑,修改步骤很简单:
- 把数据源从数组改成List:
List<string> _Set_RD_Data = new List<string> { _Test_ListView_tow[_Position], "Display" }; - 初始化Adapter的代码不用改,ArrayAdapter原生支持List作为参数
- 修改元素、调用
NotifyDataSetChanged()的逻辑保持不变
修改后的完整代码:
public class MainActivity : Activity { ArrayAdapter<string> lstAdapter; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.Main); int _Position = 0; string[] _Test_ListView_tow = { "TX1", "TX2", "TX3" }; // 替换为List<string>类型的数据源 List<string> _Set_RD_Data = new List<string> { _Test_ListView_tow[_Position], "Display" }; ListView _Test_ListView = FindViewById<ListView>(Resource.Id._Test_ListView); lstAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, _Set_RD_Data); _Test_ListView.Adapter = lstAdapter; _Test_ListView.ItemClick += (s, e) => { switch(e.Position) { case 0: if(_Position < 2) { _Position++; _Set_RD_Data[0] = _Test_ListView_tow[_Position]; lstAdapter.NotifyDataSetChanged(); Console.WriteLine("Data : " + _Set_RD_Data[0].ToString()); Toast.MakeText(this, _Set_RD_Data[0] + "Select", ToastLength.Short).Show(); } else if (_Position == 2) { _Position = 0; _Set_RD_Data[0] = _Test_ListView_tow[_Position]; lstAdapter.NotifyDataSetChanged(); Console.WriteLine("Data : " + _Set_RD_Data[0].ToString()); Toast.MakeText(this, _Set_RD_Data[0] + "Select", ToastLength.Short).Show(); } break; } }; } }
方法二:强制替换数组引用(不推荐,不够优雅)
如果你坚持用数组,每次修改元素后需要重新创建新数组替换原引用,让Adapter感知到数据源变化:
// 以点击事件的case 0为例 if(_Position < 2) { _Position++; // 重新创建数组替换原引用 _Set_RD_Data = new string[] { _Test_ListView_tow[_Position], "Display" }; lstAdapter.NotifyDataSetChanged(); // 其余代码不变 }
这种方法虽然能生效,但每次都要创建新数组,效率不如用List高。
本质原因是:ArrayAdapter对数组数据源只会在初始化时读取一次内容,后续只检查数据源的引用是否变化;而对List,它会在NotifyDataSetChanged()时重新遍历List获取最新元素,所以能正确更新显示。
内容的提问来源于stack exchange,提问作者user9694167
相关产品推荐
相关产品推荐

