【问题标题】:Android - Turn switch "On" on ListView item clickAndroid - 在 ListView 项目上单击“打开”开关
【发布时间】:2018-05-19 08:43:24
【问题描述】:

我的C# Android 应用程序中有一个自定义列表视图,每行包含一个textviewImageView 和一个switch。单击 Listview 项目时,我想打开该行的项目开关。

MainActivity:

List<TableList> list = = new List<TableList>();
list.Add(new TableList("Germany"));
list.Add(new TableList("France"));
list.Add(new TableList("Finland"));
listView.ItemClick += delegate (object sender, AdapterView.ItemClickEventArgs e)
        {
            string selected = t.Name;
            if (selected == "France")
            {
                 // Turn the proper switch for France row ON
            }
        };

Listview 的 ListAdapter 和 ListClass:

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)
    {
        return position;
    }
    public override TableList this[int position]
    {
        get { return items[position]; }
    }
    public override int Count
    {
        get { return items.Count; }
    }
    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var item = items[position];
        View view = convertView;
        if (view == null) // no view to re-use, create new
            view = 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);

        If item is clicked set it on
        {
            view.FindViewById<Switch>(Resource.Id.switch).SetOn 
        }
        else
        {
            view.FindViewById<Switch>(Resource.Id.switch).SetOf
        }
        return view;
    }
}
public class TableList
{
    public string Name;
    public TableList(string Name)
    {
        this.Name = Name;
    }
}

我不知道应该在哪里设置开关(在listView.ItemClick 事件或ListAdapter 中),我不知道如何将其设置为ON。请帮我这样做。

【问题讨论】:

  • 一旦开启,你将如何处理它,听起来你需要使用 mvvm 模式并从你的视图模型中设置这些东西
  • @TheGeneral 没什么,这只是一组设计,所以用户知道他选择了这个项目(而不是复选框)。
  • 听起来你想使用 mvvm,有一个表示列表项的视图模型,通过点击命令设置的 ischecked 属性将通知开关
  • 你测试了吗?

标签: c# android visual-studio listview xamarin


【解决方案1】:

Here 是我的演示。

您可以选择一个来实现您的目标。我将通过ItemClick event 向您展示如何做到这一点:

当一个 Listview 项目被点击时,我想打开该行的项目开关。

因为,Switch 会从ViewGroup 中获取焦点。所以,我将焦点从Switch 中的MyAdapter 中移除:

holder.ms.Focusable = false;//ms is Switch

现在,这是我的ItemClick 事件(点击项目时打开开关):

private void MListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
        var ll = e.View as LinearLayout;
        var sw = ll.GetChildAt(1) as Switch;
        if (sw.Checked)
        {
            sw.Checked = false;
            adapter.changeState((int)sw.Tag,false);
        }
        else
        {
            sw.Checked = true;
            adapter.changeState((int)sw.Tag, true);
        }
}

众所周知,ListView 存在重用问题,所以,我添加了一个 bool 属性来控制Switch 的状态:

public class MyData:Java.Lang.Object {
    public MyData(string p,bool b) {
        this.position = p;
        this.isCheck = b;
    }
    public string position { get; set; }
    public bool isCheck { get; set; }
}

下面是changeState方法:

internal void changeState(int position, bool v)
{
    mitems[position].isCheck = v;
    this.NotifyDataSetChanged();
}

这是CheckedChange事件:

private void Ms_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
{
    var sm = sender as Switch;
    Log.Error("Ms_CheckedChange", (int)sm.Tag+"");
    if (e.IsChecked&&!mitems[(int)sm.Tag].isCheck)
    {
        mitems[(int)sm.Tag].isCheck = true;
        this.NotifyDataSetChanged();
    }
    else if(!e.IsChecked&& mitems[(int)sm.Tag].isCheck)
    {
        mitems[(int)sm.Tag].isCheck = false;
        this.NotifyDataSetChanged();
    }

}

【讨论】:

  • 我在这里收到NullExceptionvar sw = ll.GetChildAt(1) as Switch;
  • 您好,我的demo改了,请检查一下。
  • Listview 的ItemClick 事件现在在哪里??
  • 我已经删除了。
  • 这都是关于 Listview 事件的,所以当一个项目被点击时,开关就会打开。我现在如何知道列表中的选定项目?在我的代码中查看我的 Listview ItemClick 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多