如何使用SimpleAdapter过滤已过滤的ListView

时间:2013-11-07 00:34:10

标签: android listview filter simpleadapter

我整天都在研究这个问题而且我没有得到任何结果!!

我一直在搜索“多个过滤器”等帖子以及更多内容,没有什么是好的。

我有一个 SimpleAdapter 和一个填充的ListView。现在我根据单词进行自定义搜索。我将这些词与空格分开。例如:

依云,我的数据是:

  

猫喜欢狗

     

狗喜欢老鼠

     

老鼠喜欢奶酪

     

猫吃奶酪

如果我过滤'cat',我会有下一个清单:

  

猫喜欢狗

     

猫吃奶酪

如果我再次使用'奶酪'过滤,我会得到:

  

猫吃奶酪

但相反,我得到了这个:

  

老鼠喜欢奶酪

     

猫吃奶酪

所以,我只得到了最后的过滤器。

这是我的代码:

public void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {
String[] separated = (cs).split(" +"); 
// With conditions not metioned here, I'm supposed to enter only words and spaces like the examples
for (int i2 = 0; i2 < separated.length ; i2++)  {
    adapter3.getFilter().filter(separated[i2]);
    adapter3.notifyDataSetChanged();                            

}

}

提前致谢!!!


修改

我有自定义适配器。我可以看到我的结果,但我无法设置我的适配器,不知道为什么。 因此,当我在另一个函数上创建setAdapter(adapter)时,它不会显示给我。 这是我的适配器:

    public class Adaptador extends SimpleAdapter implements Filterable {

    public Adaptador(Context context, ArrayList<HashMap<String, String>> data,
            int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Filter getFilter() {
        filtrodoble fil = new filtrodoble();
        return fil;
    }

    public class filtrodoble extends Filter{

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // TODO Auto-generated method stub
            FilterResults Result = new FilterResults();
            // if constraint is empty return the original names
            ArrayList<String> Filtered_Names = new ArrayList<String>();
            Filtered_Names = arraylista;
            if(constraint.length() == 0 ){
                Result.values = Filtered_Names;
                Result.count = Filtered_Names.size();
                return Result;
            }
            String nomestringa = String.valueOf(constraint);
            String[] separated = nomestringa.split(" +");

            for (int i=0;i<separated.length;i++){

            Filtered_Names = doSomethingVoid(Filtered_Names, String.valueOf(separated[i])); // it returns another ArrayList<string>
            }


            for (int i2 = 3; i2<Filtered_Names.size(); i2=i2+6)


            Result.values = Filtered_Names;
            Result.count = Filtered_Names.size();
            return Result;

        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,FilterResults results) {

            try{
                arrayaux=null;
            arrayaux = (ArrayList<String>)results.values; // MY RESULTS ARE GREAT HERE
            notifyDataSetChanged();

            } catch (Exception e){
                e.printStackTrace();
                notifyDataSetInvalidated();
            }
        }

    }

    public View getView(int position, View convertView, ViewGroup parent) {
        return convertView;
      } 
}

解决!!

由于OnTextChanged的参数,我有很多ot lv.setAdapter(null)...其中一些由missclick或其他改变。遗憾!

1 个答案:

答案 0 :(得分:0)

我认为你不能用内置的过滤器做到这一点。您需要扩展SimpleAdapter并编写自己的Filter课程。 Here's这篇文章会给你一些关于如何做到这一点的提示。