C# Xamarin Android ListView选择项并更改行颜色

C# Xamarin Android ListView选择项并更改行颜色,c#,listview,xamarin,xamarin.android,C#,Listview,Xamarin,Xamarin.android,我是xamarin的新手,我一直在到处寻找在ListView中选择项目并更改行的颜色以让用户知道选择了哪一行的方法。这是我得到的 private void FormsListViewOnItemClick(object sender, AdapterView.ItemClickEventArgs itemClickEventArgs) { _cicoListView.SetItemChecked(itemClickEventArgs.Position, true)

我是xamarin的新手,我一直在到处寻找在ListView中选择项目并更改行的颜色以让用户知道选择了哪一行的方法。这是我得到的

    private void FormsListViewOnItemClick(object sender, AdapterView.ItemClickEventArgs itemClickEventArgs)
    {
        _cicoListView.SetItemChecked(itemClickEventArgs.Position, true);
        for (var i = 0; i < _ciCos.Count; i++)
        {
            if (itemClickEventArgs.Position == i)
            {
                _selectedId = ((CicoModel)_cicoListView.Adapter.GetItem(i)).Pk;
                //_formsListView.SetItemChecked(itemClickEventArgs.Position, true);   
            }
            _cicoListView.GetChildAt(i)?.SetBackgroundColor(itemClickEventArgs.Position == i ? Color.LightGray : Color.Transparent);
        }
    }

我唯一的问题是当我向下滚动时,其他项目也被选中,因为(这是我的最佳猜测)列表视图会回收行和位置。提前感谢您的帮助。

在ListView适配器GetView方法(或RecyclerView适配器OnBindViewHolder方法)中,按如下方式插入代码:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    //inflate or restore convertView
    if(this.myItems[position].selected == true)
    {
        convertView.SetBackgroundColor(Color.Green);
    }
    convertView.Click -= ChangeBackgroundColor;
    convertView.Click += ChangeBackgroundColor;
    // This is to avoid adding more than one EventHandler every time the View is shown in the ListView.
}

private void ChangeBackgroundColor(object sender, EventArgs e)
{
    int position = this.recyclerView.GetChildAdapterPosition((View)sender);
    this.myItems[position].selected = true;
    ((View)sender).SetBackgroundColor(Color.Green);
}
您也可以使用自定义的可绘制背景,如以下问题所示:

public override View GetView(int position, View convertView, ViewGroup parent)
{
    //inflate or restore convertView
    if(this.myItems[position].selected == true)
    {
        convertView.SetBackgroundColor(Color.Green);
    }
    convertView.Click -= ChangeBackgroundColor;
    convertView.Click += ChangeBackgroundColor;
    // This is to avoid adding more than one EventHandler every time the View is shown in the ListView.
}

private void ChangeBackgroundColor(object sender, EventArgs e)
{
    int position = this.recyclerView.GetChildAdapterPosition((View)sender);
    this.myItems[position].selected = true;
    ((View)sender).SetBackgroundColor(Color.Green);
}