C# Xamarin Android ListView选择项并更改行颜色
我是xamarin的新手,我一直在到处寻找在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)
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);
}