2016-03-28 13 views
0

カスタムアダプタで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; 

誰かが正しい方向を指摘できますか?

何か不足していますか?

助けてください。

答えて

0

これは機能します。

マイ「PublishResults」方法は、次のようになります。

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(); 
     } 
    } 

そして予想通り、それは完全に働いています。

関連する問題