Listview 可展开列表视图的搜索栏
在我的代码中,我使用自定义ExpandableListViewAdapter使用BaseExpandableListAdapter。当有人在搜索栏中搜索特定单词时,我尝试筛选我的父组。然而,当我在ExpandableListViewAdapter中使用.Filter时,我试图使用ITextWatcher,但我的代码无法生成。我也不能使用InvokeFilter来过滤掉父母。有人能帮忙吗?提前谢谢你 我再次尝试通过父母来过滤;不是孩子们。这是我的主要观点:Listview 可展开列表视图的搜索栏,listview,search,xamarin,xamarin.android,expandablelistview,Listview,Search,Xamarin,Xamarin.android,Expandablelistview,在我的代码中,我使用自定义ExpandableListViewAdapter使用BaseExpandableListAdapter。当有人在搜索栏中搜索特定单词时,我尝试筛选我的父组。然而,当我在ExpandableListViewAdapter中使用.Filter时,我试图使用ITextWatcher,但我的代码无法生成。我也不能使用InvokeFilter来过滤掉父母。有人能帮忙吗?提前谢谢你 我再次尝试通过父母来过滤;不是孩子们。这是我的主要观点: using Android.App; u
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;
}
}
}
筛选器是在给定上下文中无效的方法
要在适配器上使用筛选器,您需要让适配器实现接口:
public class ExpandableListViewAdapter : BaseExpandableListAdapter,IFilterable
{
...
}
更新:
如果已实现该接口,则默认情况下过滤器为空,如下所示:
public class ExpandableListViewAdapter : BaseExpandableListAdapter,IFilterable
{
...
Filter=>throw new NotImplementedException();
}
这就是为什么你会得到例外。需要做的是创建自定义筛选器类:
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();
}
}
并初始化适配器中的筛选器:
public class ExpandableListViewAdapter : BaseExpandableListAdapter,IFilterable
{
...
public Filter Filter => new GroupFilter(this);
}
有关文件管理器的完整实现示例,您可以参考Cheesebaron的演示。请发布您的代码好吗?当我使用.Filter和我的ExpandableListViewAdapter时,我的代码不会生成。你有任何例外吗?在哪一行?当然我可以发布代码;异常是IFilter是一个在给定上下文中无效的方法。我正在查看它,但我应该在该方法中添加什么?这就是我困惑的地方。我打算使用adapter.Filter.invokefilter.NewText;但是现在当我使用它时,它不起作用,因为适配器中的filter方法除了抛出newnotimplementedException之外什么都没有;我很感激你的回答!然而,我在cheesebarons中迷失了方向,因为他的是一个列表视图,而我的是一个带有字符串的可扩展列表视图。我试着绕开它,但我得到了很多错误。对不起,当你有时间的时候,如果你能给我看看它的jist?我一直在出错,现在很难受。很抱歉反应太晚,我会给你做一个基本的演示。你能告诉我你到底想过滤什么吗?我的意思是,你的过滤规则是什么。你可以在这里找到我根据你的代码创建的演示:。请不要直接复制代码,因为我只是创建了用于使用的假数据。