使用C#

时间:2016-03-28 13:04:08

标签: c# android filter custom-adapter

我尝试使用自定义适配器在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;

有人可以指出我正确的方向吗?

我错过了什么吗?

请帮忙。

1 个答案:

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

它正如预期的那样完美运作。