2016-03-28 10 views
0

Ich versuche, Filter in ActionBar mit benutzerdefinierten Adapter zu implementieren.Implement Filtering mit benutzerdefinierten Adapter in Android mit C#

Mein benutzerdefinierter Adapter implementiert IFilterable. Und mein Filter Getter in benutzerdefinierten Adapter sieht wie folgt aus:

public Filter Filter { 
     get 
     { 
      if (tdFilter == null){ 
       tdFilter = new TodoItemFilter(); 
       tdFilter.OriginalData = this._originaltodoItemList; 
       tdFilter.TdAdapter = this; 
      } 
      return tdFilter; 
     } 
    } 

Ich habe eine ItemFilter-Klasse erstellt.

Mein überschriebenen PerformFiltering Methode in ItemFilter.cs Code wie folgt aussieht:

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

Meine überschriebenen Publishresults Methode wie folgt aussieht:

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

Und meine JavaHolder Klasse wie folgt aussieht:

public class JavaHolder : Java.Lang.Object 
{ 
    public readonly object Instance; 

    public JavaHolder(object instance) 
    { 
    Instance = instance; 
    } 
} 

Meine "PerformFiltering" -Methode funktioniert einwandfrei.

Aber, in meiner "PublishResults" -Methode, ich bin nicht in der Lage, die results.Values ​​zu meinem .NET-Objekt (TodoItem []) zu konvertieren. TdAdapter ist mein benutzerdefinierter Adapter.

TdAdapter._originaltodoItemList = ((JavaHolder)results.Values).Instance; 

Kann mir bitte jemand in die richtige Richtung zeigen?

Fehle ich etwas?

Bitte helfen.

Antwort

0

Habe es zur Arbeit.

My "PublishResults" Methode sieht nun wie folgt aus:

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

Und es funktioniert perfekt wie erwartet.

Verwandte Themen