回收视图+;SearchView Android

回收视图+;SearchView Android,android,xamarin,searchview,android-recyclerview,Android,Xamarin,Searchview,Android Recyclerview,我有一个回收视图,里面有卡片。我正在使用SearchView筛选传递给适配器的列表。我做过这样的事情:- class EmployeeAdapter : RecyclerView.Adapter, IFilterable { private IEnumerable<IGrouping<string, EmployeeModel>> dupes; private Activities.EmployeeActivity emplo

我有一个回收视图,里面有卡片。我正在使用SearchView筛选传递给适配器的列表。我做过这样的事情:-

   class EmployeeAdapter : RecyclerView.Adapter, IFilterable
    {
        private IEnumerable<IGrouping<string, EmployeeModel>> dupes;
        private Activities.EmployeeActivity employeeActivity;
        private List<IGrouping<string, EmployeeModel>> _items;
        private List<EmployeeModel> mList;
        private CustomTextView txtPlace;
        private CustomTextView txtTime;


        public EmployeeAdapter(List<EmployeeModel> mList, Activities.EmployeeActivity employeeActivity)
        {
            // TODO: Complete member initialization
            this.mList = mList;
            this.employeeActivity = employeeActivity;
            dupes = mList.GroupBy(x => x.EmployeeName).Where(x => x.Skip(1).Any());
            //Filter = new SuggestionFilter(this);
        }



        public override int ItemCount
        {
            get { return dupes.Count(); }
        }

        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            ViewHolder vh = holder as ViewHolder;
            Typeface faceThin = Typeface.CreateFromAsset(employeeActivity.Assets, "Fonts/Roboto-Thin.ttf");
            Typeface faceBold = Typeface.CreateFromAsset(employeeActivity.Assets, "Fonts/Roboto-Bold.ttf");

            vh.txtEmployeeName.Text = dupes.ElementAt(position).Key;
            foreach(EmployeeModel x in dupes.ElementAt(position))
             {

                 var layoutChild = new RelativeLayout(employeeActivity);

                 RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent);
                 lp.AddRule(LayoutRules.AlignParentLeft);
                 txtPlace = new CustomTextView(employeeActivity);
                 txtPlace.Text = x.Place;
                txtPlace.LayoutParameters = lp;
                layoutChild.AddView(txtPlace);

                RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent, RelativeLayout.LayoutParams.WrapContent);
                 lp1.AddRule(LayoutRules.AlignParentRight);
                 txtTime = new CustomTextView(employeeActivity);

                 txtTime.LayoutParameters = lp1;
                 layoutChild.AddView(txtTime);

                 vh.layoutPeopleRow.AddView(layoutChild);

                 vh.layoutVerticalCheckin.RemoveView(vh.layoutPeopleRow);
                 vh.layoutVerticalCheckin.AddView(vh.layoutPeopleRow);

              }


        }

        public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType)
        {
            View itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.people_card_row, parent, false);

            // Create a ViewHolder to hold view references inside the CardView:
            ViewHolder vh = new ViewHolder(itemView);
            return vh;
        }
        public class ViewHolder : RecyclerView.ViewHolder
        {
            public CustomTextView txtEmployeeName{ get; private set; }
            public ImageView Image { get; private set; }
            public LinearLayout layoutPeopleRow { get; private set; }
            public LinearLayout layoutVerticalCheckin { get; private set; }

            public CustomTextView txtCheckinTime { get; private set; }


            public ViewHolder(View itemView)
                : base(itemView)
            {
                // Locate and cache view references:
                Image = itemView.FindViewById<ImageView>(Resource.Id.imgEmpPic);
                txtEmployeeName = itemView.FindViewById<CustomTextView>(Resource.Id.txtEmployeeName);
                layoutPeopleRow = itemView.FindViewById<LinearLayout>(Resource.Id.layoutPeopleRow);
                layoutVerticalCheckin = itemView.FindViewById<LinearLayout>(Resource.Id.layoutVerticalCheckin);


            }

        }


        public Filter Filter
        {
            get;
            private set;
        }
        public void AnimateTo(List<EmployeeModel> models)
        {
           ApplyAndAnimateRemovals(models);
           ApplyAndAnimateAdditions(models);
           ApplyAndAnimateMovedItems(models);
        }

        private void ApplyAndAnimateMovedItems(List<EmployeeModel> newModels)
        {
            for (int toPosition = newModels.Count() - 1; toPosition >= 0; toPosition--) {
                EmployeeModel model = newModels.ElementAt(toPosition);
                int fromPosition = mList.IndexOf(model);
            if (fromPosition >= 0 && fromPosition != toPosition) {
               MoveItem(fromPosition, toPosition);
                }
         }
        }

        private void MoveItem(int fromPosition, int toPosition)
        {
             EmployeeModel model = mList.ElementAt(fromPosition);
             mList.Remove(model);
             mList.Add(model);
            this.NotifyItemMoved(fromPosition, toPosition);
        }

        private void ApplyAndAnimateAdditions(List<EmployeeModel> newModels)
        {
             for (int i = 0, count = newModels.Count(); i < count; i++) {
                 EmployeeModel model = newModels.ElementAt(i);
            if (!mList.Contains(model)) {
                AddItem(i, model);
            }
        }
        }

        private void AddItem(int i, EmployeeModel model)
        {
            mList.Add(model);
            this.NotifyItemInserted(i);
        }

        private void ApplyAndAnimateRemovals(List<EmployeeModel> newModels)
        {
            for (int i = mList.Count() - 1; i >= 0; i--) {
            EmployeeModel model = mList.ElementAt(i);
            if (!newModels.Contains(model)) {
                RemoveItem(i);
             }
          }
        }

        private EmployeeModel RemoveItem(int i)
        {
            EmployeeModel model = mList.ElementAt(i);
            mList.Remove(model);
            this.NotifyItemRemoved(i);
            return model;
        }
}
class EmployeeAdapter:RecyclerView.Adapter,IFilterable
{
私人的无数次欺骗;
私人活动。雇员活动雇员活动;
私人物品清单;
私人名单;
私人定制文本视图txtPlace;
私有CustomTextView txtTime;
公共EmployeeAdapter(列表mList,Activities.EmployeeActivity EmployeeActivity)
{
//TODO:完成成员初始化
this.mList=mList;
this.employeeActivity=employeeActivity;
dupes=mList.GroupBy(x=>x.EmployeeName).Where(x=>x.Skip(1.Any());
//过滤器=新建议过滤器(此);
}
公共覆盖int ItemCount
{
获取{return dupes.Count();}
}
公共覆盖无效OnBindViewHolder(RecyclerView.ViewHolder,int位置)
{
ViewHolder vh=作为ViewHolder的支架;
Typeface faceThin=Typeface.CreateFromAsset(employeeActivity.Assets,“font/Roboto Thin.ttf”);
Typeface-faceBold=Typeface.CreateFromAsset(employeeActivity.Assets,“Fonts/Roboto-Bold.ttf”);
vh.txtEmployeeName.Text=dupes.ElementAt(位置).Key;
foreach(雇员模型x一式两份。元件(位置))
{
var layoutChild=新的RelativeLayout(员工活动);
RelativeLayout.LayoutParams lp=新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent,RelativeLayout.LayoutParams.WrapContent);
lp.AddRule(LayoutRules.AlignParentLeft);
txtPlace=新的CustomTextView(员工活动);
txtPlace.Text=x.Place;
txtPlace.LayoutParameters=lp;
layoutChild.AddView(txtPlace);
RelativeLayout.LayoutParams lp1=新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WrapContent,RelativeLayout.LayoutParams.WrapContent);
lp1.AddRule(LayoutRules.AlignParentRight);
txtTime=新的CustomTextView(员工活动);
txtTime.LayoutParameters=lp1;
layoutChild.AddView(txtTime);
vh.layoutPeopleRow.AddView(layoutChild);
vh.layoutVerticalCheckin.RemoveView(vh.layoutPeopleRow);
vh.layoutVerticalCheckin.AddView(vh.layoutPeopleRow);
}
}
public override RecyclerView.ViewHolder OnCreateViewHolder(视图组父级,int-viewType)
{
View itemView=LayoutFlater.From(parent.Context).充气(Resource.Layout.people\u card\u行,parent,false);
//创建ViewHolder以在CardView中保留视图参照:
ViewHolder vh=新的ViewHolder(项目视图);
返回vh;
}
公共类ViewHolder:RecyclerView.ViewHolder
{
public CustomTextView txtEmployeeName{get;private set;}
公共图像视图图像{get;private set;}
public LinearLayout layoutPeopleRow{get;private set;}
public LinearLayout layoutVerticalCheckin{get;private set;}
public CustomTextView txtCheckinTime{get;private set;}
公共视图持有者(视图项视图)
:基本(项目视图)
{
//查找并缓存视图引用:
Image=itemView.findviewbyd(Resource.Id.imgEmpPic);
txtEmployeeName=itemView.FindViewById(Resource.Id.txtEmployeeName);
layoutPeopleRow=itemView.FindViewById(Resource.Id.layoutPeopleRow);
layoutVerticalCheckin=itemView.FindViewById(Resource.Id.layoutVerticalCheckin);
}
}
公共过滤器
{
得到;
私人设置;
}
public void AnimateTo(列出模型)
{
应用数据删除(模型);
应用程序添加(模型);
应用数据移动数据项(模型);
}
私有void applyandImateMovedItems(列出新模型)
{
对于(int-toPosition=newModels.Count()-1;toPosition>=0;toPosition--){
EmployeeModel model=newModels.ElementAt(位置);
int fromPosition=mList.IndexOf(模型);
if(fromPosition>=0&&fromPosition!=TopoPosition){
移动项目(从位置、位置);
}
}
}
私有void移动项(int-fromPosition、int-toPosition)
{
EmployeeModel=mList.ElementAt(fromPosition);
mList.Remove(模型);
mList.Add(模型);
此.NotifyItemMoved(从位置、位置);
}
私有无效应用程序添加(列出新模型)
{
for(int i=0,count=newModels.count();i=0;i--){
EmployeeModel=mList.ElementAt(i);
如果(!newModels.Contains(model)){
删除项目(i);
}
}
}
私人雇员模型RemoveItem(int i)
{
EmployeeModel=mList.ElementAt(i);
mList.Remove(模型);
本条第(i)款;
收益模型;
}
}
有两个问题:

  • 搜索工作进展顺利
    void search_QueryTextChange(object sender, Android.Support.V7.Widget.SearchView.QueryTextChangeEventArgs e)
            {
    
                if (string.IsNullOrEmpty(e.NewText))
                {
                    List<EmployeeModel> filteredModelList = filter(mList, "");
                }
                else
                {
                    List<EmployeeModel> filteredModelList = filter(mList, e.NewText);
                    mAdapter.AnimateTo(filteredModelList);
                    mRecyclerView.ScrollToPosition(0);
                }
            }
    
            private List<EmployeeCheckinModel> filter(List<EmployeeModel> models, String query)
            {
                 query = query.ToLower();
    
             List<EmployeeModel> filteredModelList = new List<EmployeeModel>();
                foreach (EmployeeModel model in models) {
                String text = model.EmployeeName.ToLower();
                if (text.Contains(query)) {
                    filteredModelList.Add(model);
                }
            }
            return filteredModelList;
        }