我尝试使用自定义适配器在ActionBar中实现过滤器。
我的自定义适配器实现了IFilterable。我的自定义适配器中的Filter getter看起来像:
public Filter Filter {
get
{
if (tdFilter == null){
tdFilter = new TodoItemFilter();
tdFilter.OriginalData = this._originaltodoItemList;
tdFilter.TdAdapter = this;
}
return tdFilter;
}
}
我创建了一个ItemFilter类。
我在ItemFilter.cs代码中的重写PerformFiltering方法如下所示:
protected override Filter.FilterResults PerformFiltering(Java.Lang.ICharSequence constraint)
{
FilterResults oreturn = new FilterResults();
if (constraint == null || constraint.Length() == 0)
{
oreturn.Values = this.OriginalData.ToJavaObject();
oreturn.Count = this.OriginalData.Length;
}
else
{
string[] actualResults = new string[this.originalData.Length];
List<TodoItem> tdiList = new List<TodoItem> ();
int i=0;
foreach (TodoItem td in this.originalData)
{
if(td.Name.ToUpperInvariant().StartsWith(constraint.ToString().ToUpperInvariant())){
tdiList.Add (td);
i++;
}
}
oreturn.Values = tdiList.ToJavaObject();
oreturn.Count = tdiList.Count;
}
return oreturn;
}
我的重写Publishresults方法如下:
protected override void PublishResults(Java.Lang.ICharSequence constraint, Filter.FilterResults results)
{
if (results.Count == 0)
this.TdAdapter.NotifyDataSetInvalidated();
else
{
var propertyInfo = ((JavaHolder)results.Values).Instance;
TdAdapter.NotifyDataSetChanged();
}
}
我的JavaHolder类看起来像:
public class JavaHolder : Java.Lang.Object
{
public readonly object Instance;
public JavaHolder(object instance)
{
Instance = instance;
}
}
我的&#34; PerformFiltering&#34;方法工作正常。
但是,在我的&#34; PublishResults&#34;方法,我无法转换结果。对我的.NET对象(TodoItem [])的值。 TdAdapter是我的自定义适配器。
TdAdapter._originaltodoItemList = ((JavaHolder)results.Values).Instance;
有人可以指出我正确的方向吗?
我错过了什么吗?
请帮忙。
答案 0 :(得分:0)
让它发挥作用。
我的&#34; PublishResults&#34;方法现在看起来像这样:
protected override void PublishResults(Java.Lang.ICharSequence constraint, Filter.FilterResults results)
{
if (results.Count == 0)
this.TdAdapter.NotifyDataSetInvalidated();
else
{
System.Object obj = results.Values.ToNetObject<System.Object>();
IEnumerable enumerable = obj as IEnumerable;
List<TodoItem> LTdi = new List<TodoItem> ();
if (enumerable != null)
{
foreach(object element in enumerable)
{
LTdi.Add (element as TodoItem);
}
}
TdAdapter._originaltodoItemList = LTdi.ToArray();
TdAdapter.NotifyDataSetChanged();
}
}
它正如预期的那样完美运作。