You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:38:28