【发布时间】:2012-12-07 07:42:02
【问题描述】:
我已经为我的 MultiAutoCompleteTextView 实现了一个自定义适配器。它只是按照我想要的方式过滤,但结果没有像我过滤的那样显示。我认为与 publishResult(..) 方法有关,但我无法弄清楚。
public class customConAdapter<String> extends ArrayAdapter implements Filterable {
private Filter filter;
List<String> sublist=new ArrayList<String>();
List<String> conlist = new ArrayList<String>();
public customConAdapter(Context context,
int textViewResourceId, List<String> conlist) {
super(context, textViewResourceId, conlist);
this.conlist = conlist;
this.sublist = conlist;
// TODO Auto-generated constructor stub
}
public Filter getFilter() {
if (filter == null){
filter = new myFilter();
}
return filter;
}
private class myFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
Log.i("in perfrom filtering",constraint.toString());
FilterResults results = new FilterResults();
/* if ((constraint == null) || (constraint.length() == 0))
{
ArrayList<String> list = new ArrayList<String>();
results.values = list;
results.count = list.size();
}
else*/
String constr = (String) constraint.toString();
final List<String> newItems = new ArrayList<String>();
for (String temp : conlist)
{
if ( ((java.lang.String) temp).toLowerCase().contains(constraint))
{ Log.i("the item of list that contains the constraint is" ,(java.lang.String)temp);
newItems.add(temp);
}
}
results.values = newItems;
results.count = newItems.size();
publishResults(constraint,results);
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results)
{
if (results.count > 0)
{
sublist=(ArrayList<String>) results.values;
notifyDataSetChanged();
}
else
{
notifyDataSetInvalidated();
}
}
}
}
【问题讨论】:
-
过滤后的结果没有显示 - 需要解释一下吗?也不要在
performFiltering()方法中称自己为publishResults(constraint,results);方法,直接返回results即可。此外,您的sublist应该是conlist的副本,它将用作传递给适配器的完整项目的副本(因此您将在Filter中拥有全套初始值)。 -
如果问了一个愚蠢的问题,我很抱歉,但是如何将“子列表”设置为过滤器中适配器的新列表?我想让过滤器也能够显示子字符串的结果..
-
看这个:
if (results.count > 0) { clear(); for(String item : results.values) { add(item);}} -
抱歉,但尝试过但无法通过 results.values 进行迭代。..
-
投到
ArrayList<String>:if (results.count > 0) {ArrayList<String> data =(ArrayList<String>) results.values;clear(); for(String item : data) { add(item);}}
标签: android filter custom-adapter