回收视图+;SearchView Android
我有一个回收视图,里面有卡片。我正在使用SearchView筛选传递给适配器的列表。我做过这样的事情:-回收视图+;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
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;
}