【问题标题】:No results with custom ArrayAdapter Filter自定义 ArrayAdapter 过滤器没有结果
【发布时间】:2012-01-05 12:29:10
【问题描述】:

我在 AutoCompleteTextView 上使用 ArrayAdapter。 results.values 具有预期值,但我在 UI 上没有列表。

public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
    private final Object mLock = new Object();
    private CustomFilter mFilter;
    public ArrayList<String> mItems;
    public ArrayList<String> mFiltered;

    public CustomArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mItems = new ArrayList<String>();
        mFiltered = new ArrayList<String>();
    }

    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new CustomFilter();
        }
        return mFilter;
    }

    @Override
    public void add(String s) { 
        mItems.add(s);
    }

    private class CustomFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (mItems == null) {
                synchronized (mLock) {
                    mItems = new ArrayList<String>();
                }
            }

            if (constraint == null || constraint.length() == 0) {
                synchronized (mLock) {
                    results.values = mItems;
                    results.count = mItems.size();
                }
            } else {
                final ArrayList<String> newItems = new ArrayList<String>();

                for (int i = 0; i < mItems.size(); i++) {
                    final String item = mItems.get(i);
                    if(item.contains(constraint)) {
                        newItems.add(item);
                    }
                }
                results.values = newItems;
                results.count = newItems.size();
            }

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            mFiltered.clear();
            mFiltered.addAll((ArrayList<String>) results.values);
            notifyDataSetChanged();
        }

    }
}

【问题讨论】:

    标签: android filter android-arrayadapter


    【解决方案1】:

    有几天我一直在网上研究如何使用 hashmap 在 arraylist 中进行研究,幸运的是我遇到了这篇文章。

    我对 arraylist 进行了改编 > 并且成功了。现在我与您分享,您会知道有人使用 ArrayList 和 HashMap 来解决同样的问题。谢谢 Pim Reijersen!

    public class CategoriaAdapterModel extends BaseAdapter implements Filterable {
    
    private Activity context;
    private ArrayList<HashMap<String, String>> mDataShown;
    private ArrayList<HashMap<String, String>> mAllData;
    private Filter mFilter;
    private LayoutInflater inflater;
    DownloadImagemUtil downloader;
    
    public CategoriaAdapterModel(Activity context,
            ArrayList<HashMap<String, String>> data) {
        this.context = context;
        this.mAllData = data;
        this.mDataShown = data;
        downloader = new DownloadImagemUtil(context);
    }
    
    public void add(HashMap<String, String> object) {
        mAllData.add(object);
        this.notifyDataSetChanged();
    }
    
    public int getCount() {
        return mDataShown.size();
    }
    
    public Object getItem(int position) {
    
        return mDataShown.get(position);
    }
    
    public long getItemId(int position) {
        return position;
    
    }
    
    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new CustomFilter();
        }
        return mFilter;
    }
    
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
    }
    
    private class CustomFilter extends Filter {
    
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
    
            if (constraint == null || constraint.length() == 0) {
                ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(
                        mAllData);
                results.values = list;
                results.count = list.size();
            } else {
                ArrayList<HashMap<String, String>> newValues = new ArrayList<HashMap<String, String>>();
                for (int i = 0; i < mAllData.size(); i++) {
                    HashMap<String, String> item = mAllData.get(i);
                    if (item.get(JsonFragmentCategoriaCONN.TAG_NOME)
                            .toLowerCase()
                            .contains(constraint.toString().toLowerCase())) {
                        newValues.add(item);
                    }
                }
                results.values = newValues;
                results.count = newValues.size();
            }
    
            return results;
        }
    
        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            mDataShown = (ArrayList<HashMap<String, String>>) results.values;
            Log.d("CustomArrayAdapter", String.valueOf(results.values));
            Log.d("CustomArrayAdapter", String.valueOf(results.count));
            notifyDataSetChanged();
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      您需要覆盖 CustomArrayAdapter 中的 getCount 方法:

      @Override
      public int getCount() {
          return mFiltered.size();
      }
      

      并修改你的 publishResults 方法代码:

      protected void publishResults(CharSequence constraint,FilterResults results) {
                  mFiltered = (List<String>) results.values;
                  notifyDataSetChanged();
              }
      

      【讨论】:

        【解决方案3】:

        看起来重写几个函数就可以了。 工作版本的完整来源:

        public class CustomArrayAdapter extends ArrayAdapter<String> implements Filterable {
        private List<String> mOrigionalValues;
        private List<String> mObjects;
        private Filter mFilter;
        
        public CustomArrayAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
            mOrigionalValues = new ArrayList<String>();
            mObjects = new ArrayList<String>();
        }
        
        public void add(String object) {
            mOrigionalValues.add(object);
            this.notifyDataSetChanged();
        }
        
        @Override
        public int getCount() {
            return mObjects.size();
        }
        
        @Override
        public String getItem(int position) {
            return mObjects.get(position);
        }
        
        public Filter getFilter() {
            if (mFilter == null) {
                mFilter = new CustomFilter();
            }
            return mFilter;
        }
        
        @Override
        public void notifyDataSetChanged() {
            super.notifyDataSetChanged();
        }
        
        private class CustomFilter extends Filter {
        
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
        
                if(constraint == null || constraint.length() == 0) {
                    ArrayList<String> list = new ArrayList<String>(mOrigionalValues);
                    results.values = list;
                    results.count = list.size();
                } else {
                    ArrayList<String> newValues = new ArrayList<String>();
                    for(int i = 0; i < mOrigionalValues.size(); i++) {
                        String item = mOrigionalValues.get(i);
                        if(item.contains(constraint)) {
                            newValues.add(item);
                        }
                    }
                    results.values = newValues;
                    results.count = newValues.size();
                }       
        
                return results;
            }
        
            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                    FilterResults results) {
                mObjects = (List<String>) results.values;
                Log.d("CustomArrayAdapter", String.valueOf(results.values));
                Log.d("CustomArrayAdapter", String.valueOf(results.count));
                notifyDataSetChanged();
            }
        
        }
        
        }
        

        【讨论】:

        猜你喜欢
        • 2012-04-24
        • 2018-11-18
        • 1970-01-01
        • 2013-02-20
        • 1970-01-01
        • 2013-06-18
        • 2011-09-23
        • 1970-01-01
        • 2012-08-23
        相关资源
        最近更新 更多