【问题标题】:Custom Adapter for MultiAutoTextViewMultiAutoTextView 的自定义适配器
【发布时间】: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 &gt; 0) { clear(); for(String item : results.values) { add(item);}}
  • 抱歉,但尝试过但无法通过 results.values 进行迭代。..
  • 投到ArrayList&lt;String&gt; : if (results.count &gt; 0) {ArrayList&lt;String&gt; data =(ArrayList&lt;String&gt;) results.values;clear(); for(String item : data) { add(item);}}

标签: android filter custom-adapter


【解决方案1】:

替换此行

 if ( ((java.lang.String) temp).toLowerCase().contains(constraint))

这个

 if (temp.toLowerCase().contains(constr))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多