2017-05-30 141 views
1

我是新来的xamarin,我一直在寻找一种方式来选择ListView中的项目,并更改该行的颜色,让用户知道哪一行是选择。下面是我得到Xamarin Android 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); 
     } 
    } 

这种方法是该项目的点击处理程序

_cicoListView.ItemClick += FormsListViewOnItemClick; 

我唯一的问题是,当我向下滚动,其他项目都选择了太多,因为(这是我最好的猜测)列表视图可以回收行和位置。先谢谢您的帮助。

回答

2

在你的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); 
} 

您也可以做到这一点通过使用自定义绘制背景,想在这个问题:

Android: set list view item as "selected" (highlighted)

相关问题