2017-09-15 15 views
0

私のコードでカスタムのExpandableListViewAdapterを使用しています。ユーザー入力に関するコードをフィルタリングすると、アプリケーションは正常に動作します。ただし、ユーザーが消去されたときに、リストビューは、最後の検索を離れ、その後、入力がに置かれたときにブランクになる入力言っここに私のコードは次のとおりです。 メイン:フィルタの後のすべての項目を削除するフィルタメソッド

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); 
} 
private void searchBar_QueryTextChange(object sender, SearchView.QueryTextChangeEventArgs e) 
    { 

     mAdapter.Filter.InvokeFilter(e.NewText); 
    } 

} 
} 

これは私のExpandableListviewアダプタです:

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 BarStar 
{ 
public class ExpandableListViewAdapter : BaseExpandableListAdapter, IFilterable 
{ 
    private Context context; 
    public List<string> listGroup; 
    public 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 Filter Filter => new GroupFilter(this); 

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


} 

}

これは私のフィルタクラスである:

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 BarStar 
{ 
class GroupFilter : Filter 
{ 
    ExpandableListViewAdapter _adapter; 
    ExpandableListViewAdapter placeholder; 
    public GroupFilter(ExpandableListViewAdapter adapter) 
    { 
     _adapter = adapter; 
    } 
    protected override FilterResults PerformFiltering(ICharSequence constraint) 
    { 
     var returnObject = new FilterResults(); 
     if (constraint == null || constraint.Length() == 0) 
     { 
      // No filter implemented we return all the list 
      returnObject.Values = _adapter; 
      returnObject.Count = _adapter.listGroup.Count(); 
     } 
     else 
     { 

      var tmpList = _adapter.listGroup.Where(g => g.ToLower().Contains(constraint.ToString().ToLower())); 

      returnObject.Values = FromArray(tmpList.ToArray()); 
      returnObject.Count = tmpList.Count(); 
     } 
     return returnObject; 
    } 

    protected override void PublishResults(ICharSequence constraint, FilterResults results) 
    { 
     if (results.Count == 0) 
     { 
      _adapter.NotifyDataSetInvalidated(); 
     } 
     else 
     { 
      _adapter.listGroup = results.Values.ToArray<string>().ToList<string>(); 
      _adapter.NotifyDataSetChanged(); 
      constraint.Dispose(); 
      results.Dispose(); 
     } 
    } 


} 

}

答えて

1

しかし、ユーザが消去されたときに入力リストビューは、最後の検索を離れ、その後、入力はあなたがそれをできるようにExpandableListviewAdapterにいくつかの変更を行う必要があり

に置かれたとき、ブランクになると述べました動的にユーザの入力に応じて変化する:ExpandableListviewAdapter.cs

フィルタを保存するために、あなたがFilterのゲッターを呼び出したときに新しいフィルタを作成していないローカル変数を作成します。

0をその後で

あなたFilterあなたlistGroupの元のデータを格納するための新しいリストを作成:

private class GroupFilter : Filter 
{ 
    List<string> _originalList; 
    ... 
    public GroupFilter(ExpandableListViewAdapter adapter) 
    { 
     _adapter = adapter; 
     _originalList = new List<string>(adapter.listGroup); 
    } 

    ... 
    protected override FilterResults PerformFiltering(ICharSequence constraint) 
    { 
     var returnObject = new FilterResults(); 

     //var tmpList= _originalList.Where(g => g.ToLower().Contains(constraint.ToString().ToLower())); 
     //use LinQ to generate the filter result 
     var tmpList = from o in _originalList where o.ToLower().Contains(constraint.ToString().ToLower()) select o; 

     returnObject.Values = FromArray(tmpList.ToArray()); 
     returnObject.Count = tmpList.Count(); 
     return returnObject; 
    } 
} 
+0

申し訳ありませんが、私は結果を公開で何置けばいいの? _originalListにはNotifyDataSetChanged()がありません。そのために –

+0

結果を同じにしておきます。私はデモを更新しました。チェックをしてください:[TestFilterDemo](https://github.com/elvisxia/TestFilterDemo) –

+0

ありがとうございました!そのTestFilterDemoは人生保護者です –

関連する問題