2017-09-12 27 views
0

私のコードでは、カスタムExpandableListViewAdapterを使用して、BaseExpandableListAdapterを使用します。誰かが検索バーの特定の単語を検索したときに、親グループをフィルタリングしようとしています。私はITextWatcherを使用しようとしていましたが、ExpandableListViewAdapter mAdapterで.Filterを使用すると、コードが作成されませんでした。私はまた、InvokeFilter(s)を使用して親を除外することはできません。誰かが助けてくれますか?前もって感謝します!ExpandableListViewの検索バー

もう一度私は親をフィルタリングしようとしています。子供たちではない。これが私のメインです:

using Android.App; 
using Android.Widget; 
using Android.OS; 
using System.Net; 
using Java.Lang; 
using System; 
using Newtonsoft.Json.Linq; 
using System.Linq; 
using Java.Util; 
using System.Threading; 
using Org.Json; 
using Android.Content; 
using Android.Views; 
using System.Collections.Generic; 
using System.Text; 
using RestSharp.Extensions.MonoHttp; 
using Android.Text; 

namespace DictionaryE 
{ 
    [Activity(Label = "DictionaryE", MainLauncher = true, Icon = "@drawable/logo")] 
public class MainActivity : Activity 
{ 
    private ExpandableListView list; 
    private ExpandableListViewAdapter mAdapter; 
    private ArrayAdapter<string> adapter; 
    private int length; 
    private List<string> group= new List<string>(); 
    private string[] names; 
    private Dictionary<string, List<string>> Mapout = new Dictionary<string, List<string>>(); 
    private SearchView searchBar; 
    private View.IOnClickListener listener; 


    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 
     SetContentView(Resource.Layout.Main); 
     ActionBar.Hide(); 
     // Set Views 
     searchBar = FindViewById<SearchView>(Resource.Id.searchBar); 
     list = FindViewById<ExpandableListView>(Resource.Id.lv); 
     //Set Groups 
     WebClient client = new WebClient(); 
     string json = client.DownloadString("********************"); 
     JSONArray myarray = new JSONArray(json); 
     length = myarray.Length(); 
     names = new string[length]; 
     for (int i = 0; i < length; i++) 
     { 
      JSONObject Element = myarray.GetJSONObject(i); 
      names[i] = Element.GetString("name"); 
     } 
     setData(out mAdapter); 
     list.SetAdapter(mAdapter); 

     mAdapter.Filter.InvokeFilter(); 

    } 

    private void setData(out ExpandableListViewAdapter mAdapter) 
    { 
     string urlholder; 
     string url; 
     string json; 
     string time; 
     string timestamp; 
     string together; 
     WebClient client1 = new WebClient(); 
     for (int i=0;i < length; i++) 
     { 
      List<string> listplaceholder = new List<string>(); 
      group.Add(names[i]); 
      urlholder = Uri.EscapeDataString(names[i]); 
      url = "**********"; 
      json = client1.DownloadString(url); 
      JSONArray array2 = new JSONArray(json); 
      int length2 = array2.Length(); 
      for (int j = 0; j < length2; j++) 
      { 
       JSONObject Element = array2.GetJSONObject(j); 
       time=Element.GetString("wait"); 
       JSONObject TimeElement = array2.GetJSONObject(j); 
       timestamp = TimeElement.GetString("created_at"); 
       timestamp=timestamp.Replace("T", " at "); 
       int index = timestamp.IndexOf("."); 
       if (index > 0) 
       { 
        timestamp = timestamp.Substring(0, index); 
       } 
       together = time + " minutes posted at " + timestamp; 
       listplaceholder.Add(together); 
      } 
      Mapout.Add(group[i], listplaceholder); 


     } 
     mAdapter = new ExpandableListViewAdapter(this, group, Mapout); 
    } 

} 
} 

これは私のカスタム拡張ベースアダプタです:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Java.Lang; 

namespace DictionaryE 
{ 
public class ExpandableListViewAdapter : BaseExpandableListAdapter 
{ 
    private Context context; 
    private List<string> listGroup; 
    private Dictionary<string, List<string>> listChild; 

    public ExpandableListViewAdapter(Context context, List<string> listGroup, Dictionary<string, List<string>> listChild) 
    { 
     this.context = context; 
     this.listGroup = listGroup; 
     this.listChild = listChild; 
    } 
    public override int GroupCount 
    { 
     get 
     { 
      return listGroup.Count; 
     } 
    } 

    public override bool HasStableIds 
    { 
     get 
     { 
      return false; 
     } 
    } 

    public override Java.Lang.Object GetChild(int groupPosition, int childPosition) 
    { 
     var result = new List<string>(); 
     listChild.TryGetValue(listGroup[groupPosition], out result); 
     return result[childPosition]; 
    } 

    public override long GetChildId(int groupPosition, int childPosition) 
    { 
     return childPosition; 
    } 

    public override int GetChildrenCount(int groupPosition) 
    { 
     var result = new List<string>(); 
     listChild.TryGetValue(listGroup[groupPosition], out result); 
     return result.Count; 
    } 

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService); 
      convertView = inflater.Inflate(Resource.Layout.Children, null); 
     } 
     TextView textViewItem = convertView.FindViewById<TextView>(Resource.Id.DataValue); 
     string content = (string)GetChild(groupPosition, childPosition); 
     textViewItem.Text = content; 
     return convertView; 
    } 

    public override Java.Lang.Object GetGroup(int groupPosition) 
    { 
     return listGroup[groupPosition]; 
    } 

    public override long GetGroupId(int groupPosition) 
    { 
     return groupPosition; 
    } 

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService); 
      convertView = inflater.Inflate(Resource.Layout.Groups, null); 
     } 
     string textGroup = (string)GetGroup(groupPosition); 
     TextView textViewGroup = convertView.FindViewById<TextView>(Resource.Id.Header); 
     textViewGroup.Text = textGroup; 
     return convertView; 
    } 

    public override bool IsChildSelectable(int groupPosition, int childPosition) 
    { 
     return true; 
    } 


} 

}

+0

コードを投稿してください。そして、「私のExpandableListViewAdapter mAdapterで.Filterを使用すると、私のコードはビルドされません」というメッセージが表示されます。 –

+0

私はコードを投稿できます。 IFilterは、指定されたコンテキストでは有効ではない例外です。 –

答えて

1

フィルターは、指定されたコンテキストで有効でない方法です。

アダプタにフィルタを使用するには、あなたのアダプタがIFilterableインターフェイスを実装できるようにする必要があります。

public class ExpandableListViewAdapter : BaseExpandableListAdapter,IFilterable 
{ 
    ... 
} 

アップデート:

あなたは、デフォルトでは、インターフェイスを実装している場合Filterは空です以下のようになります。

public class ExpandableListViewAdapter : BaseExpandableListAdapter,IFilterable 
{ 
    ... 
    Filter=>throw new NotImplementedException(); 
} 

これは、に。あなたはCheesebaronのデモhereを参照することができ、ファイラーの完全な実装のサンプルについて

​​

public class GroupFilter:Filter 
{ 
    ExpandableListViewAdapter _adapter; 
    public GroupFilter(ExpandableListViewAdapter adapter) 
    { 
     _adapter = adapter; 
    } 
    protected override FilterResults PerformFiltering(ICharSequence constraint) 
    { 
     var result = new FilterResults(); 
     // add the filtered items to FilterResults 
     //convert net object to java object 
     return result; 
    } 

    protected override void PublishResults(ICharSequence constraint, FilterResults results) 
    { 
     //convert java object to Net object 
     //Call _adapter.NotifyDataSetChanged(); 
    } 
} 

そして、あなたのアダプタでフィルターを初期化:何行われる必要があることは、カスタムフィルタクラスを作成することです。

+0

私はそれを見ていましたが、その方法に何を追加しますか?それは私が混乱していたものです。私はadapter.Filter.InvokeFilter(e.NewText)を使用するつもりだった。しかし、私はそれを使用するとき、アダプタのフィルタメソッドは何も持っていないので、新しいNotImplementedException()をスローするので、動作しません。 –

+0

私は答えを更新しました。確認してください。 –

+0

私は答えをありがとう!しかし、私は彼がリストビューであり、私が文字列を含む展開可能なリストビューであるので、私はチーズバロンで迷子になっています。私はそれを回避しようとしていますが、私は多くのエラーが発生しています。 –