【问题标题】:Custom filtering in AutoCompleteTextView not workingAutoCompleteTextView 中的自定义过滤不起作用
【发布时间】:2012-07-20 17:54:51
【问题描述】:

我正在扩展阵列适配器,但我仍然得到旧的结果,你能告诉我是什么问题吗?

public class Adaptor extends ArrayAdapter<String> implements Filterable{

        private ArrayList<String> items;

        public Adaptor(Context context, int textViewResourceId, String[] objects) {
            super(context, textViewResourceId, objects);
            items = new ArrayList<String>();
            for (int i = 0; i < objects.length ; i++)
                items.add(objects[i]);

        }


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


        @Override
        public String getItem(int position) {
            return items.get(position);
        }

        @Override
        public Filter getFilter() {
            Filter myFilter = new Filter(){

                @Override
                protected FilterResults performFiltering(CharSequence arg0) {
                    FilterResults rezultate = new FilterResults();
                    ArrayList<String> chestii = new ArrayList<String>();
                    for (int i = 0; i < items.size() ; i++)
                    {
                        String tmp = items.get(i).toUpperCase();
                        if (tmp.startsWith(arg0.toString().toUpperCase()))
                                chestii.add(items.get(i));

                    }
                    rezultate.count = chestii.size();
                    rezultate.values = chestii;
                    return rezultate;
                }

                @Override
                protected void publishResults(CharSequence constraint,
                        FilterResults results) {
                    if (results != null && results.count > 0)
                    {
                        notifyDataSetChanged();
                    }
                    else notifyDataSetInvalidated();

                }

            };
            return myFilter;
        }




    }

【问题讨论】:

    标签: android


    【解决方案1】:

    您的列表包含“项目”中的项目并且您不修改其中的项目,您必须从“项目”中删除位置,然后调用 notifyDataSetChange,以恢复最近您必须保存以前项目的所有项目

    这很好用:

    /**
     * Adapter wrapper to represent list of dialogs
     * @author Ryazantsev Dmitry
     * @email dilix90@gmail.com 2012
     */
    public class FriendsAdapter extends ArrayAdapter<User>
    {
        private final LayoutInflater inflater;
        private final ImageLoader il;
        private Context parentContext;
        private List<User> mData;
        private List<User> mOriginalData;
        public SimpleImageLoader sil;
    
        @Override
        public void add(User object)
        {
            if (mOriginalData != null)
                mOriginalData.add(object);
            else
                mData.add(object);
        }
    
        @Override
        public void remove(User object)
        {
            if (mOriginalData != null)
                mOriginalData.remove(object);
            else
                mData.remove(object);
        }
    
        @Override
        public int getCount()
        {
            return mData.size();
        }
    
        @Override
        public User getItem(int position)
        {
            return mData.get(position);
        }
    
        @Override
        public int getPosition(User item)
        {
            return mData.indexOf(item);
        }
    
        public FriendsAdapter(Context context, int textViewResourceId, List<User> objects)
        {
            super(context, textViewResourceId, objects);
            Log.v("refresh", context + " " + textViewResourceId + " " + objects);
            parentContext = context;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            il = new ImageLoader(context);
            mData = objects;
            sil = new SimpleImageLoader(context, true, 64);
            sil.setOnUiThread(false);
        }
    
        /**
         * We have a custom view and need to organize it
         */
        @Override
        public View getView(final int position, View convertView, final ViewGroup parent)
        {
    
            ViewHolder holder;
            if (convertView == null)
            {
                convertView = inflater.inflate(R.layout.friends_list_row, null);
                holder = new ViewHolder();
                holder.name = (TextView) convertView.findViewById(R.id.friendName);
                holder.root = convertView.findViewById(R.id.root);
                holder.photo = (ImageView) convertView.findViewById(R.id.friendPhoto);
                holder.online = (ImageView) convertView.findViewById(R.id.online);
                convertView.setTag(holder);
            }
            else
                holder = (ViewHolder) convertView.getTag();
    
            User user = getItem(position);
            holder.online.setVisibility(user.isOnline() > 0 ? View.VISIBLE : View.GONE);
            if (user != null)
            {
                holder.name.setText(user.getFIO());
                holder.photo.setTag(user.getPhotoUrl());
                if (user.getPhotoBitmap() != null)
                    holder.photo.setImageBitmap(user.getPhotoBitmap());
                else
                {
                    holder.photo.setImageResource(R.drawable.contact_nophoto);
                    sil.displayImageUserAttach(holder.photo, user.getPhotoUrl(), user, null, false, null);
                }
            }
    
            // parent.setVisibility(position % 2 == 0?View.GONE:View.VISIBLE);
            return convertView;
        }
    
        private static class ViewHolder
        {
            public TextView name;
            public ImageView photo;
            public View root;
            public View online;
        }
    
        @Override
        public Filter getFilter()
        {
            return new Filter()
            {
                @SuppressWarnings("unchecked")
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results)
                {
                    Log.v("filter", "filter finished");
                    mData = (List<User>) results.values;
                    if (results.count > 0)
                    {
                        notifyDataSetChanged();
                    }
                    else
                    {
                        notifyDataSetInvalidated();
                    }
                }
    
                @Override
                protected FilterResults performFiltering(CharSequence constraint)
                {
                    Log.v("filter", "filter perform");
                    if (mOriginalData == null)
                        mOriginalData = new ArrayList<User>(mData);
                    List<User> result;
                    FilterResults r = new FilterResults();
                    if (constraint == null || constraint.length() <= 0)
                        result = new ArrayList<User>(mOriginalData);
                    else
                    {
                        result = new ArrayList<User>();
                        for (int i = 0; i < mOriginalData.size(); i++)
                            if (constraint.length() > 0
                                    && mOriginalData.get(i).getFIO().toLowerCase()
                                            .contains(constraint.toString().toLowerCase()))
                                result.add(mOriginalData.get(i));
                    }
                    r.values = result;
                    r.count = result.size();
                    return r;
                }
            };
        }
    
    }
    

    【讨论】:

    • 那么 FilterResults 的目的是什么?
    • 您在 performFiltering 和 publishResults 之间传输数据。根据本手册:developer.android.com/reference/android/widget/Filter.html 您的过滤器是异步的,您需要分配后台工作和发布并将结果传递给 UI 线程
    • notifyDataSetChanged 和 notifyDataSetInvalidated 在 android.widget.Filter 中不再可用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2017-09-12
    • 2021-01-03
    • 1970-01-01
    • 2017-07-25
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多