我正在使用Xamarin.android创建一个android应用。我的应用程序有一个自定义的列表视图,每行有5个文本视图。我想使用搜索视图来突出显示文本视图中与搜索视图具有相同文本的文本,或者至少根据我的搜索视图文本过滤列表视图。我在以下问题https://github.com/851265601/Xamarin.Android_ListviewSelect/blob/master/XAListViewSearchDemo.zip中找到了这个示例:Filter ListView with SearchView xamarin,并尝试应用它。这是我的代码:
listview的适配器:homeadapter:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Java.Lang;
namespace App36
{
public class homeadapter : BaseAdapter<Rsultitem>, IFilterable
{
public List<Rsultitem> items;
public List<Rsultitem> originaldata;
public readonly Activity context;
public homeadapter(Activity context, IEnumerable<Rsultitem> items)
: base()
{
this.context = context;
this.items = items.ToList();
Filter = new TableItemFilter(this);
}
public void AddData(Rsultitem tableItem)
{
items.Add(tableItem);
NotifyDataSetChanged();
}
public override long GetItemId(int position)
{
return position;
}
public override Rsultitem this[int position]
{
get { return items[position]; }
}
public Filter Filter { get; private set; }
public override int Count
{
get { return items.Count; }
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var context = this.context;
var item = items[position];
View view = convertView;
if (view == null) // no view to re-use, create
view = convertView ?? context.LayoutInflater.Inflate(Resource.Layout.custom, null);
//view = context.LayoutInflater.Inflate(Resource.Layout.custom, null);
view.FindViewById<TextView>(Resource.Id.textView1).Text = item.itembarcode;
view.FindViewById<TextView>(Resource.Id.textView2).Text = item.name;
view.FindViewById<TextView>(Resource.Id.textView3).Text = item.itemsunitcode;
view.FindViewById<TextView>(Resource.Id.textView4).Text = item.currentQuantity;
view.FindViewById<TextView>(Resource.Id.textView5).Text = item.moreInfo;
//view.FindViewById<CheckBox>(Resource.Id.chbox).Checked=global.Exist;
//var t = view.FindViewById<TextView>(Resource.Id.textView5);
//t.Click +=delegate {
// Android.Widget.Toast.MakeText(context, t.Text, Android.Widget.ToastLength.Short).Show();
// //t.SetBackgroundColor(Android.Graphics.Color.Aqua);
//};
// view.FindViewById<TextView>(Resource.Id.My_textView1).Text = items[position];
TextView textView = view.FindViewById<TextView>(Resource.Id.textView5);
TextView textView1 = view.FindViewById<TextView>(Resource.Id.textView1);
TextView textView2 = view.FindViewById<TextView>(Resource.Id.textView2);
TextView textView3 = view.FindViewById<TextView>(Resource.Id.textView3);
TextView textView4 = view.FindViewById<TextView>(Resource.Id.textView4);
//textView.Text = items[position].ToString();
// textView.Click += TextView_Click;
if (!textView.HasOnClickListeners)
{
textView.Click += (o, e) =>
{
Toast.MakeText(context, "click", ToastLength.Short).Show();
context.StartActivity(typeof(Activity1));
};
}
return view;
}
public override void NotifyDataSetChanged()
{
// this.NotifyDataSetChanged();
base.NotifyDataSetChanged();
}
}
public class TableItemFilter : Filter
{
private readonly homeadapter _adapter;
public TableItemFilter(homeadapter adapter)
{
_adapter = adapter;
}
protected override FilterResults PerformFiltering(ICharSequence constraint)
{
var returnObj = new FilterResults();
var results = new List<Rsultitem>();
if (_adapter.originaldata == null)
_adapter.originaldata = _adapter.items;
if (constraint == null) return returnObj;
if (_adapter.originaldata != null && _adapter.originaldata.Any())
{
results.AddRange(
_adapter.originaldata.Where(
item => item.itembarcode.ToLower().Contains(constraint.ToString()) | item.itemsunitcode.ToLower().Contains(constraint.ToString())| item.name.ToLower().Contains(constraint.ToString())| item.currentQuantity.ToLower().Contains(constraint.ToString())));
}
returnObj.Values = FromArray(results.Select(r => r.ToJavaObject()).ToArray());
returnObj.Count = results.Count;
constraint.Dispose();
return returnObj;
}
protected override void PublishResults(ICharSequence constraint, FilterResults results)
{
using (var values = results.Values)
_adapter.items = values.ToArray<Java.Lang.Object>().Select(r => r.ToNetObject<Rsultitem>()).ToList();
_adapter.NotifyDataSetChanged();
// Don't do this and see GREF counts rising
constraint.Dispose();
results.Dispose();
}
}
public class JavaHolder : Java.Lang.Object
{
public readonly object Instance;
public JavaHolder(object instance)
{
Instance = instance;
}
}
public static class ObjectExtensions
{
public static TObject ToNetObject<TObject>(this Java.Lang.Object value)
{
if (value == null)
return default(TObject);
if (!(value is JavaHolder))
throw new InvalidOperationException("Unable to convert to .NET object. Only Java.Lang.Object created with .ToJavaObject() can be converted.");
TObject returnVal;
try { returnVal = (TObject)((JavaHolder)value).Instance; }
finally { value.Dispose(); }
return returnVal;
}
public static Java.Lang.Object ToJavaObject<TObject>(this TObject value)
{
if (Equals(value, default(TObject)) && !typeof(TObject).IsValueType)
return null;
var holder = new JavaHolder(value);
return holder;
}
}
}
我的主要活动:
List<Rsultitem> tableItems = new List<Rsultitem>();
ListView lst;
homeadapter hm;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
string info = "More Info";
lst = FindViewById<ListView>(Resource.Id.List);
for (int i = 0; i < 20; i++)
{
//tableItems.Add(new Rsultitem() { itembarcode = itmcode[i], name = itmname[i], itemsunitcode= itmunit[i], currentQuantity=itmQty[i],moreInfo=info});
tableItems.Add(new Rsultitem() { itembarcode = "fff", name = "jhhh", itemsunitcode = "jjj", currentQuantity = "uy", moreInfo = info });
}
hm = new homeadapter(this, tableItems);
lst.Adapter=hm;
SearchView searchView1 = FindViewById<SearchView>(Resource.Id.searchView1);
searchView1.QueryTextChange += (s, e) => hm.Filter.InvokeFilter(e.NewText);
searchView1.QueryTextSubmit += (s, e) =>
{
// Handle enter/search button on keyboard here
Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
e.Handled = true;
};
}
private class SearchViewExpandListener : Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
{
private readonly IFilterable _adapter;
public SearchViewExpandListener(IFilterable adapter)
{
_adapter = adapter;
}
public bool OnMenuItemActionCollapse(IMenuItem item)
{
_adapter.Filter.InvokeFilter("");
return true;
}
public bool OnMenuItemActionExpand(IMenuItem item)
{
return true;
}
}
但是问题是什么也没发生。提交后,我只想吐司告诉搜索视图中写了什么。没有过滤发生。很长的帖子我很抱歉。谁能帮我找到问题。预先感谢。