2016-03-28 19 views
0

Özel Adaptörle ActionBar uygulamasında Filtre uygulamasına çalışıyorum.Android ile Özel Adaptörle Filtreleme Uygula C#

Özel bağdaştırıcım IFilterable uygular. Bir ItemFilter sınıfı oluşturduk

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

: gibi Ve özel adaptör benim Filtre alıcı görünüyor.

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

Benim overriden Publishresults yöntemi gibi görünüyor:

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

Ve JavaHolder sınıfı gibi görünür:

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

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

ItemFilter.cs kodunda Benim overriden PerformFiltering yöntemi görünüyor

"PerformFiltering" yöntemim düzgün çalışıyor.

Ancak, "PublishResults" yöntemimde, results.Values ​​öğesini benim .NET nesnelerine (TodoItem []) dönüştürebiliyorum. TdAdapter benim özel adaptörüm.

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

Birisi bana lütfen doğru yöne işaret edebilir mi?

Bir şey mi eksik?

Lütfen

Yardım edin.

cevap

0

Çalıştırdım.

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

Ve beklendiği gibi mükemmel çalışıyor:

Benim "PublishResults" yöntemi şöyle görünüyor.