通过这两个名字的ListView ArrayAdapter过滤 [英] ListView ArrayAdapter filtering by two names

查看:195
本文介绍了通过这两个名字的ListView ArrayAdapter过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经做了针对Android应用程序列出与名字联系等于例如约翰。但我需要用名1 名2 ,例如彼得或约翰

我已经尝试设置过滤器彼得或John 彼得||约翰,但它确实不行。你能帮我吗?


解决方案

 您应该编写自定义适配器和过滤器。    公共类MyAdapter<吨扩展BaseEntity>扩展ArrayAdapter< T>实现可筛选{        私人MainClass.ObjectFilter滤波器;
        私人最终名单< T>物体;        公共MyAdapter(列表< T>对象){
             在此输入code
this.objects =物体;
             用getFilter();
        }        @覆盖
        公共过滤用getFilter(){
            如果(过滤== NULL){
                MainClass OFC =新MainClass(对象);
                过滤器= ofc.getObjectFilter();
            }
            返回过滤器;
        }        在此输入code
    }
    和自定义过滤器
    公共类MainClass<吨扩展BaseEntity>扩展BaseEntity {        私人列表< T> allObjectItemsArray; //所有联系人列表
        私人列表< T> filteredObjectItemsArray; //过滤联系人列表        公共ObjectFilterMainClass(列表< T>的对象)
          {
            this.allObjectItemsArray =新的ArrayList< T>();
            this.allObjectItemsArray.addAll(对象);
            this.filteredObjectItemsArray =新的ArrayList< T>();
            this.filteredObjectItemsArray.addAll(allObjectItemsArray);
        }        公共ObjectFilter的getObjectFilter(){
        返回新ObjectFilter的();
        }
        公共类ObjectFilter的扩展过滤器{        @覆盖
        公共FilterResults performFiltering(CharSequence的约束){
                //约束搜索文本 - >彼得·约翰OR
                约束= constraint.toString()与toLowerCase()。
            FilterResults结果=新FilterResults();
            如果(约束=空&放大器;!&放大器; constraint.toString()长度()大于0){
            ArrayList的< T> filteredItems =新的ArrayList< T>();            答:(INT I = 0; I< allObjectItemsArray.size();我++){
                的Tm = allObjectItemsArray.get(I)
                        //投米类
                字符串fistnameAndLastName =((你的对象类)M).getFirstName()+((你的对象类)M).getLastName();                如果(fistnameAndLastName.toLowerCase()。包括(约束)){
                    filteredItems.add(米);
                    继续执行;
                }            }
            result.count = filteredItems.size();
            result.values​​ = filteredItems;
            }其他{
            同步(本){
                result.values​​ = allObjectItemsArray;
                result.count = allObjectItemsArray.size();
            }
            }
            返回结果;
        }          @覆盖
        公共无效publishResults(CharSequence的约束,FilterResults结果){            filteredObjectItemsArray =(ArrayList的< T>)results.values​​;
            adapter.notifyDataSetChanged();
            adapter.clear();
            如果(filteredObjectItemsArray!= NULL){            的for(int i = 0; I< filteredObjectItemsArray.size();我++)
                adapter.add(filteredObjectItemsArray.get(I));
            }
            adapter.notifyDataSetInvalidated();
        }        }    }    主要的一点就是让姓和名,并检查约束的文本。
    之后,如果真的添加f​​ilteredItems列表。    字符串fistnameAndLastName =((你的对象类)M).getFirstName()+((你的对象类)M).getLastName();    如果(fistnameAndLastName.toLowerCase()。包括(约束))
    {
        filteredItems.add(米);
        继续执行;
    并使用:    美国东部时间的EditText =(EditText上)this.view.findViewById(R.id.edtTxtName);            edt.addTextChangedListener(新TextWatcher(){
            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数后INT){
            }            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                addFilterToList();
            }            @覆盖
            公共无效afterTextChanged(编辑S){            }
            });    公共无效addFilterToList(){        ListView控件的ListView =(ListView控件)this.view.findViewById(R.id.listView);        美国东部时间的EditText =(EditText上)this.view.findViewById(R.id.edtTxtName);        MyAdapter MYA =(MyAdapter)//
            (listView.getAdapter());        。myA.getFilter()过滤(edt.getText());        listView.setAdapter(MYA);
        }

I have done an application for android to list contact with first name equals for example John. But I need view contact with name1 OR name2, for example Peter OR John.

I have tried set filter "Peter OR John", "Peter || John", but it does not work. Can you help me, please?

解决方案

    you should be write your custom adapter and filter. 



    public class MyAdapter<T extends BaseEntity> extends ArrayAdapter<T> implements Filterable{

        private MainClass.ObjectFilter filter;
        private final List<T> objects;

        public MyAdapter(List<T> objects){
             enter code here
this.objects = objects;
             getFilter();
        }

        @Override
        public Filter getFilter() {
            if (filter == null){
                MainClass ofc = new MainClass(objects);
                filter  = ofc.getObjectFilter();
            }
            return filter;
        }

        enter code here 
    }


    and custom filter


    public class MainClass<T extends BaseEntity> extends BaseEntity {

        private List<T> allObjectItemsArray; // all contact list
        private List<T> filteredObjectItemsArray; // filtered contact list

        public ObjectFilterMainClass(List<T> objects)
          {
            this.allObjectItemsArray = new ArrayList<T>();
            this.allObjectItemsArray.addAll(objects);
            this.filteredObjectItemsArray = new ArrayList<T>();
            this.filteredObjectItemsArray.addAll(allObjectItemsArray);
        }

        public ObjectFilter getObjectFilter(){
        return new ObjectFilter();
        }


        public class ObjectFilter extends Filter {

        @Override
        public FilterResults performFiltering(CharSequence constraint) {
                // constraint search text -->  Peter OR John
                constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<T> filteredItems = new ArrayList<T>();

            a: for (int i = 0; i < allObjectItemsArray.size(); i++) {
                T m = allObjectItemsArray.get(i);
                        // cast m to your class
                String fistnameAndLastName = ((your object class) m).getFirstName() + ((your object class) m).getLastName();

                if (fistnameAndLastName.toLowerCase().contains(constraint)) {
                    filteredItems.add(m);
                    continue a;
                }

            }
            result.count = filteredItems.size();
            result.values = filteredItems;
            } else {
            synchronized (this) {
                result.values = allObjectItemsArray;
                result.count = allObjectItemsArray.size();
            }
            }
            return result;
        }

          @Override
        public void publishResults(CharSequence constraint, FilterResults results) {

            filteredObjectItemsArray = (ArrayList<T>) results.values;
            adapter.notifyDataSetChanged();
            adapter.clear();
            if (filteredObjectItemsArray != null) {

            for (int i = 0; i < filteredObjectItemsArray.size(); i++)
                adapter.add(filteredObjectItemsArray.get(i));
            }
            adapter.notifyDataSetInvalidated();
        }

        }

    }

    main point is get first and last name and check the constraint text.
    after that if true add filteredItems list.

    String fistnameAndLastName = ((your object class) m).getFirstName() + ((your object class) m).getLastName();

    if (fistnameAndLastName.toLowerCase().contains(constraint)) 
    {
        filteredItems.add(m);
        continue a;


    and use :

    EditText edt = (EditText) this.view.findViewById(R.id.edtTxtName);

            edt.addTextChangedListener(new TextWatcher() {
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                addFilterToList();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
            }); 

    public void addFilterToList() {

        ListView listView = (ListView) this.view.findViewById(R.id.listView);

        EditText edt = (EditText) this.view.findViewById(R.id.edtTxtName);

        MyAdapter myA = (MyAdapter) //
            (listView.getAdapter());  

        myA.getFilter().filter(edt.getText());

        listView.setAdapter(myA);
        }

这篇关于通过这两个名字的ListView ArrayAdapter过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆