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

Android C#:点击ListView项时开启对应行Switch的实现方法

我来帮你搞定这个问题!其实最佳实践是用数据驱动UI状态,而不是直接操作控件——这能避免ListView视图复用带来的各种奇怪问题。下面是具体的实现步骤:

1. 给数据模型增加状态字段

首先修改你的TableList类,添加一个IsEnabled属性来记录对应行Switch的开启状态:

public class TableList 
{
    public string Name { get; set; }
    public bool IsEnabled { get; set; } // 新增:记录Switch的开启状态

    public TableList(string name) 
    {
        Name = name;
        IsEnabled = false; // 默认关闭
    }
}

2. 修改Adapter,让UI跟随数据变化

在ListAdapter的GetView方法里,根据当前item的IsEnabled属性来设置Switch的状态——这样每次复用视图时,都会根据最新的数据更新控件:

public class ListAdapter : BaseAdapter<TableList> 
{
    List<TableList> items;
    Activity context;

    public ListAdapter(Activity context, List<TableList> items) : base() 
    {
        this.context = context;
        this.items = items;
    }

    public override long GetItemId(int position) => position;

    public override TableList this[int position] => items[position];

    public override int Count => items.Count;

    public override View GetView(int position, View convertView, ViewGroup parent) 
    {
        var item = items[position];
        View view = convertView ?? context.LayoutInflater.Inflate(Resource.Layout.CoinList, null);

        // 设置文本和图片
        view.FindViewById<TextView>(Resource.Id.CoinName).Text = item.Name;
        view.FindViewById<ImageView>(Resource.Id.imageView1).SetImageResource(Resource.Drawable.n);

        // 根据数据状态设置Switch
        var switchControl = view.FindViewById<Switch>(Resource.Id.switch);
        switchControl.Checked = item.IsEnabled;

        return view;
    }
}

3. 在ItemClick事件里更新数据并刷新UI

点击ListView的行时,找到对应位置的TableList对象,修改它的IsEnabled为true,然后通知Adapter刷新UI——这样就能保证对应的Switch被正确开启:

List<TableList> list = new List<TableList>();
list.Add(new TableList("Germany"));
list.Add(new TableList("France"));
list.Add(new TableList("Finland"));

// 初始化Adapter并绑定到ListView
var adapter = new ListAdapter(this, list);
listView.Adapter = adapter;

listView.ItemClick += (sender, e) => 
{
    // 获取点击位置的item
    var selectedItem = list[e.Position];
    // 开启Switch
    selectedItem.IsEnabled = true;
    // 通知Adapter数据变化,刷新对应行的UI
    adapter.NotifyDataSetChanged();

    // 如果只需要针对特定项(比如你例子中的France)开启,加个判断即可:
    // if (selectedItem.Name == "France")
    // {
    //     selectedItem.IsEnabled = true;
    //     adapter.NotifyDataSetChanged();
    // }
};

为什么不直接在ItemClick里操作控件?

如果直接在ItemClick里通过e.View.FindViewById<Switch>()去设置Switch,会因为ListView的视图复用机制,导致滚动后其他行的Switch错误地保持开启状态。而用数据驱动的方式,每次绘制行时都会根据数据的真实状态设置控件,从根源上避免了这个问题。

内容的提问来源于stack exchange,提问作者Wassim01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:41:36