Android 多选回收视图
我想在recyclerview中实现multiselect。我几乎得到它,但它的行为古怪的时候,或当有许多项目 我想有多选功能,在选择中,我想改变项目的背景色,并恢复它里面所有文本视图的文本颜色 我面临一个奇怪的问题,如果我选择第一条记录并向下滚动,那么即使是第八条记录也会被自动选中。如果我选择第二条记录,那么第九条记录也会被选中 代码如下:Android 多选回收视图,android,xamarin,android-recyclerview,multi-select,Android,Xamarin,Android Recyclerview,Multi Select,我想在recyclerview中实现multiselect。我几乎得到它,但它的行为古怪的时候,或当有许多项目 我想有多选功能,在选择中,我想改变项目的背景色,并恢复它里面所有文本视图的文本颜色 我面临一个奇怪的问题,如果我选择第一条记录并向下滚动,那么即使是第八条记录也会被自动选中。如果我选择第二条记录,那么第九条记录也会被选中 代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models.ViewModels;
using Android.App;
using Android.Content;
using Android.Graphics;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.Widget;
using Android.Views;
using Android.Widget;
namespace A.Droid.Adapters
{
public class DeliveryAdapter : RecyclerView.Adapter//, View.IOnClickListener
{
List<RequestViewModel> list;
public Context v;
public event EventHandler<int> phoneClick;
List<RequestViewModel> selectedList = new List<RequestViewModel>();
public DeliveryAdapter(List<RequestViewModel> records, Context v1)
{
list = records;
v = v1;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
{
// Inflate the CardView for the photo:
View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.activity_cardview_slinkyRecordList, parent, false);
DeliveryListViewHolder vh = new DeliveryListViewHolder(itemView, OnPhoneClick);
return vh;
}
// Fill in the contents of the photo card (invoked by the layout manager):
public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
{
DeliveryListViewHolder viewHolder = holder as DeliveryListViewHolder;
viewHolder.PICNumber.Text = string.IsNullOrEmpty(list[position].PICNumber) ? "-" : list[position].PICNumber;
viewHolder.PropertyName.Text = string.IsNullOrEmpty(list[position].PropertyName) ? "-" : list[position].PropertyName;
viewHolder.ContactAddress.Text = string.IsNullOrEmpty(list[position].ContactAddress) ? "-" : list[position].ContactAddress;
viewHolder.ContactPerson.Text = string.IsNullOrEmpty(list[position].ContactPerson) ? "-" : list[position].ContactPerson;
viewHolder.ContactNumber.Text = string.IsNullOrEmpty(list[position].ContactNumber) ? "-" : list[position].ContactNumber;
viewHolder.NumberOfAliveSpecies.Text = list[position].NumberOfAliveStock + " Alive " + list[position].NameOfSpecies;
viewHolder.NumberOfDeadSpecies.Text = list[position].NumberOfDeadStock + " Dead " + list[position].NameOfSpecies;
viewHolder.DistanceOfTransporterToPIC.Text = list[position].DistanceOfTransporterFromPIC.ToString() + " KM"; //DeliveryList[position].DistanceOfTransporterFromPIC.ToString();
//viewHolder.MainLinearLayout.SetOnClickListener((new OnClickListener(viewHolder.MainLinearLayout,position)); // cardViewList.Add(viewHolder.cardView); //add all the cards to this list
//viewHolder.MainLinearLayout.SetOnClickListener(this); // cardViewList.Add(viewHolder.cardView); //add all the cards to this list
viewHolder.cardView.Click += delegate (object sender, EventArgs e)
{
if (selectedList.All(i => i.slinkyStockRequestId != list[position].slinkyStockRequestId))
{
selectedList.Add(list[position]);
viewHolder.MainLinearLayout.SetBackgroundColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.PICNumber.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.PropertyName.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.ContactAddress.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.ContactPerson.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.ContactNumber.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.NumberOfAliveSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.NumberOfDeadSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.DistanceOfTransporterToPIC.SetTextColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.mapIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.dark_blue), PorterDuff.Mode.SrcAtop);
viewHolder.contactIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.dark_blue), PorterDuff.Mode.SrcAtop);
viewHolder.phoneIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.dark_blue), PorterDuff.Mode.SrcAtop);
}
else
{
selectedList.Remove(list[position]);
viewHolder.MainLinearLayout.SetBackgroundColor(v.Resources.GetColor(Resource.Color.dark_blue));
viewHolder.PICNumber.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.PropertyName.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.ContactAddress.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.ContactPerson.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.ContactNumber.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.NumberOfAliveSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.NumberOfDeadSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.DistanceOfTransporterToPIC.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.mapIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.white), PorterDuff.Mode.SrcAtop);
viewHolder.contactIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.white), PorterDuff.Mode.SrcAtop);
viewHolder.phoneIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.white), PorterDuff.Mode.SrcAtop);
}
};
animate(holder);
}
public List<RequestViewModel> GetSelectedItems()
{
return selectedList;
}
// Return the number of photos available in the photo album:
public override int ItemCount
{
get { return list.Count; }
}
// Raise an event when the phone-click takes place:
void OnPhoneClick(int position)
{
if (phoneClick != null)
{
phoneClick(this, position);
}
}
public class DeliveryListViewHolder : RecyclerView.ViewHolder
{
public ImageView MapTag { get; private set; }
public TextView PICNumber { get; private set; }
public TextView PropertyName { get; private set; }
public TextView ContactAddress { get; private set; }
public TextView ContactPerson { get; private set; }
public TextView ContactNumber { get; private set; }
public TextView NameOfSpecies { get; private set; }
public TextView NumberOfAliveSpecies { get; private set; }
public TextView NumberOfDeadSpecies { get; private set; }
public TextView DistanceOfTransporterToPIC { get; private set; }
public CardView cardView { get; private set; }
public LinearLayout MainLinearLayout { get; private set; }
public ImageView mapIcon { get; private set; }
public ImageView contactIcon { get; private set; }
public ImageView phoneIcon { get; private set; }
// Get references to the views defined in the CardView layout.
public DeliveryListViewHolder(View itemView, Action<int> phoneClickListener) : base(itemView)
{
MapTag = itemView.FindViewById<ImageView>(Resource.Id.mapIcon);
PICNumber = itemView.FindViewById<TextView>(Resource.Id.PICNumber);
PropertyName = itemView.FindViewById<TextView>(Resource.Id.nameOfProperty);
ContactPerson = itemView.FindViewById<TextView>(Resource.Id.contactPerson);
NumberOfAliveSpecies = itemView.FindViewById<TextView>(Resource.Id.noOfAliveSpecies);
NumberOfDeadSpecies = itemView.FindViewById<TextView>(Resource.Id.noOfDeadSpecies);
DistanceOfTransporterToPIC = itemView.FindViewById<TextView>(Resource.Id.areaInKM);
ContactAddress = itemView.FindViewById<TextView>(Resource.Id.address);
ContactNumber = itemView.FindViewById<TextView>(Resource.Id.mobileNo);
mapIcon = itemView.FindViewById<ImageView>(Resource.Id.mapIcon);
contactIcon = itemView.FindViewById<ImageView>(Resource.Id.contactIcon);
phoneIcon = itemView.FindViewById<ImageView>(Resource.Id.phoneIcon);
cardView = itemView.FindViewById<CardView>(Resource.Id.mainCardviewLayout);
MainLinearLayout = itemView.FindViewById<LinearLayout>(Resource.Id.MainLinearLayout);
ContactNumber.Click += (sender, e) => phoneClickListener(base.Position);
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用Models.ViewModels;
使用Android.App;
使用Android.Content;
使用Android.Graphics;
使用Android.OS;
使用Android.Runtime;
使用Android.Support.V7.Widget;
使用Android.Views;
使用Android.Widget;
命名空间A.Droid.Adapters
{
公共类DeliveryAdapter:RecyclerView.Adapter//,View.IOnClickListener
{
名单;
公共环境v;
公共事件事件处理程序phoneClick;
List selectedList=新建列表();
public DeliveryAdapter(列表记录,上下文v1)
{
列表=记录;
v=v1;
}
public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType)
{
//为照片的CardView充气:
View itemView=LayoutFlater.From(parent.Context).充气(Resource.Layout.activity\u cardview\u slinkyRecordList,parent,false);
DeliveryListViewHolder vh=新的DeliveryListViewHolder(项目视图,电话点击);
返回vh;
}
//填写照片卡的内容(由布局管理器调用):
公共覆盖无效OnBindViewHolder(RecyclerView.ViewHolder,int位置)
{
DeliveryListViewHolder viewHolder=作为DeliveryListViewHolder的持有人;
viewHolder.PICNumber.Text=string.IsNullOrEmpty(列表[position].PICNumber)?“-”:列表[position].PICNumber;
viewHolder.PropertyName.Text=string.IsNullOrEmpty(列表[position].PropertyName)?“-”:列表[position].PropertyName;
viewHolder.ContactAddress.Text=string.IsNullOrEmpty(列表[position]。ContactAddress)?“-”:列表[position]。ContactAddress;
viewHolder.ContactPerson.Text=string.IsNullOrEmpty(列表[位置]。联系人)?“-”:列表[位置]。联系人;
viewHolder.ContactNumber.Text=string.IsNullOrEmpty(列表[位置].ContactNumber)?“-”:列表[位置].ContactNumber;
viewHolder.NumberOfAliveSpecies.Text=列表[position]。NumberOfAliveStock+“Alive”+列表[position]。物种名称;
viewHolder.NumberOfDeadSpecies.Text=列表[position]。NumberOfDeadStock+“Dead”+列表[position]。物种名称;
viewHolder.DistanceOfTransporterToPIC.Text=list[position]。DistanceOfTransporterFromPIC.ToString()+“KM”//DeliveryList[position]。DistanceOfTransporterFromPIC.ToString();
//viewHolder.MainLinearLayout.SetOnClickListener((新OnClickListener(viewHolder.MainLinearLayout,position));//cardViewList.Add(viewHolder.cardView);//将所有卡片添加到此列表中
//viewHolder.MainLinearLayout.SetOnClickListener(此);//cardViewList.Add(viewHolder.cardView);//将所有卡片添加到此列表
viewHolder.cardView.Click+=委托(对象发送者,事件参数e)
{
if(selectedList.All(i=>i.slinkyStockRequestId!=list[position].slinkyStockRequestId))
{
选择列表。添加(列表[位置]);
viewHolder.MainLinearLayout.SetBackgroundColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.PICNumber.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.PropertyName.SetTextColor(v.Resources.GetColor(Resource.Color.dark_-blue));
viewHolder.ContactAddress.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.ContactPerson.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.ContactNumber.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.NumberOfAliveSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.NumberOfDeadSpecies.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.DistanceOfTransporterToPIC.SetTextColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.mapIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.深蓝)、PorterDuff.Mode.srcaptop);
viewHolder.contactIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.深蓝)、PorterDuff.Mode.SrcAtop);
viewHolder.phoneIcon.SetColorFilter(v.Resources.GetColor(Resource.Color.dark_blue)、PorterDuff.Mode.SrcAtop);
}
其他的
{
选择列表。删除(列表[位置]);
viewHolder.MainLinearLayout.SetBackgroundColor(v.Resources.GetColor(Resource.Color.深蓝));
viewHolder.PICNumber.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.PropertyName.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.ContactAddress.SetTextColor(v.Resources.GetColor(Resource.Color.white));
viewHolder.ContactPerson.SetTextColor(v.Resources.GetColor(Resource.Color.wh
list.get(position).setSelected(true);
notifyItemChanged(position);
private boolean isSelected = false
public boolean isSelected() {
return isSelected;
}
public void setSelected(boolean selected) {
isSelected = selected;
}
int pos = (int) view.getTag();
list[pos].setSelected(!list[pos].isSelected());
notifyItemChanged(position);