Custom filtering for Custom ArrayAdapter in ListView

前端 未结 4 2157
小鲜肉
小鲜肉 2021-01-16 03:58

i write a own ArrayAdapter like this one:

public class PoiListAdapter extends ArrayAdapter implements Filterable {

    private Context context;
          


        
4条回答
  •  情书的邮戳
    2021-01-16 04:30

    i could solve my Problems. Here my solution!

        package hsos.ds.helper;
    
    import hsos.ds.db.Poi;
    
    import java.util.ArrayList;
    import java.util.List;
    import android.widget.Filter;
    
    public class ItemsFilter extends Filter {
    
        private PoiListAdapter poiAdapter;
        private List valuesPoi;
        private List filteredPoi;
    
        public ItemsFilter(PoiListAdapter _poiAdapter) {
            this.poiAdapter = _poiAdapter;
            this.valuesPoi = poiAdapter.getValuesPoi();
            this.filteredPoi = poiAdapter.getFilteredPoi();
        }
    
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults result = new FilterResults();
            constraint = constraint.toString().toLowerCase();
    
            if (constraint == null || constraint.length() == 0) {
                ArrayList list = new ArrayList(valuesPoi);
                result.values = valuesPoi;
                result.count = valuesPoi.size();
    
            } else {
                final ArrayList orginalList = new ArrayList(valuesPoi);
                final ArrayList filterList = new ArrayList();
                int count = orginalList.size();
                for (int i = 0; i < count; i++) {
                    final Poi p = orginalList.get(i);
                    if (p.getName().toLowerCase().contains(constraint))
                        filterList.add(p);
                }
                result.values = filterList;
                result.count = filterList.size();
            }
            return result;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            filteredPoi = (List) results.values;
            poiAdapter.notifyDataSetChanged();
            poiAdapter.clear();
            int count = filteredPoi.size();
            for (int i = 0; i < count; i++) {
                poiAdapter.add(filteredPoi.get(i));
                poiAdapter.notifyDataSetInvalidated();
            }
        }
    }
    

    and the Adapter:

    public class PoiListAdapter extends ArrayAdapter implements Filterable {

    private List valuesPoi;
    private List filteredPoi;
    private ItemsFilter mFilter;
    
    public PoiListAdapter(Context context, List valuesPoi) {
        super(context, R.layout.poilist);
        this.valuesPoi = new ArrayList(valuesPoi);
        this.filteredPoi = new ArrayList(valuesPoi);
        this.mFilter = new ItemsFilter(this);
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.poilist, null);
        }
    
        Poi p = filteredPoi.get(position);
    
        if (p != null) {
            TextView tt = (TextView) v.findViewById(R.id.name_poi);
            TextView bt = (TextView) v.findViewById(R.id.discrip_poi);
            if (tt != null) {
                tt.setText(p.getName());
            }
            if (bt != null) {
                bt.setText(p.getDiscription());
            }
        }
        return v;
    }
    
    @Override
    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new ItemsFilter(this);
        }
        return mFilter;
    }
    
    public List getValuesPoi() {
        return valuesPoi;
    }
    
    
    public List getFilteredPoi() {
        return filteredPoi;
    
    }
    

    }

    To show the complete list onStart() i insert the a little "hack" in the onStart()-Method of my activity because the complete list is shown after an input:

    if(searchText!=null){
            searchText.setText(" ");
            searchText.setText("");
        }
    

提交回复
热议问题