カスタムアダプタでActionBarのフィルタを実装しようとしています。C#でAndroidでカスタムアダプタを使用したフィルタリングを実装する
私のカスタムアダプターはIFilterableを実装しています。カスタムアダプタのフィルタゲッターは次のようになります。
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;
}
}
私の "PerformFiltering"メソッドは正常に動作しています。
しかし、私の "PublishResults"メソッドでは、results.Valuesを.NETオブジェクト(TodoItem [])に変換できません。 TdAdapterは私のカスタムアダプタです。
TdAdapter._originaltodoItemList = ((JavaHolder)results.Values).Instance;
誰かが正しい方向を指摘できますか?
何か不足していますか?
助けてください。