J'utilise un ExpandableListViewAdapter personnalisé avec mon code. Lorsque je filtre le code par rapport à l'entrée de l'utilisateur, l'application fonctionne correctement. Toutefois, lorsque l'utilisateur efface ladite entrée de la vue de la liste laisse la dernière recherche, puis se vide quand une entrée est mis en Voici mon code:. principal:Méthode de filtrage se débarrasser de tous les éléments après le filtre
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);
}
}
}
Ceci est mon ExpandableListview Adaptateur:
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;
}
}
}
Ceci est mon filtre classe:
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();
}
}
}
}
Désolé que dois-je mettre en publier les résultats? Parce que le _originalList n'a pas NotifyDataSetChanged(); pour cela –
Publier les résultats reste le même. J'ai mis à jour la démo, s'il vous plaît avoir un chèque: [TestFilterDemo] (https://github.com/elvisxia/TestFilterDemo) –
Merci beaucoup pour votre aide! que TestFilterDemo est un sauveur de vie –