首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可用BaseAdapter过滤到AutoCompleteTextView?

可用BaseAdapter过滤到AutoCompleteTextView?
EN

Stack Overflow用户
提问于 2015-02-22 19:27:05
回答 1查看 1.3K关注 0票数 0

我正在尝试创建一个可过滤到我的BaseAdapter的AutoCompleteTextView。我有一个名为Local的对象,我向这个对象添加了一些属性,例如:‘new Local("Guaira");new Local("Franca");new Local("Barretos")。如果我键入文本"Guaíra“,弹出窗口将不会打开以选择"Guaira",但如果我键入"Barretos”是打开的,并显示“Guaira”、"Franca“和"Barretos”。我不明白为什么不行。

我怎么能做到呢?

AutoCompleteTextView

代码语言:javascript
复制
<AutoCompleteTextView
                    android:id="@+id/acCidade"
                    android:layout_margin="10dp"
                    android:padding="10dp"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:dropDownWidth="fill_parent"
                    android:inputType="textCapWords"
                    android:hint="Cidade"
                    android:scrollbars="vertical"
                    />

BaseAdapter

代码语言:javascript
复制
public class CidadeListAdapter extends BaseAdapter implements Filterable{
    private Context context;
    private List<Cidade> lista;
    private Filtro filtro;

    public CidadeListAdapter(Context context, List<Cidade> lista){
        this.context = context;
        this.lista = lista;
    }

    public void clearList(){
        lista.clear();
        notifyDataSetChanged();
    }

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

    @Override
    public Object getItem(int position) {
        return lista.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Cidade cidade = lista.get(position);
        ViewHolder viewHolder;
        if(convertView == null){
            viewHolder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.estado_cidades_listadapter, parent, false);
            viewHolder.llEstadoCidades = (LinearLayout) convertView.findViewById(R.id.llEstadoCidades);
            viewHolder.tvEstadoCidade = (TextView) convertView.findViewById(R.id.tvEstadoCidade);

            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder)convertView.getTag();
        }
        viewHolder.tvEstadoCidade.setText(cidade.getCidade());
        return convertView;
    }

    @Override
    public Filter getFilter() {
        if(filtro == null){
            filtro = new Filtro();
        }
        return filtro;
    }


    //holder pattern
    private static class ViewHolder{
        LinearLayout llEstadoCidades;
        TextView tvEstadoCidade;
    }


    /** filtro de autocomplete */
    private class Filtro extends Filter{

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();
            // We implement here the filter logic
            if (constraint == null || constraint.length() == 0) {
                // No filter implemented we return all the list
                results.values = lista;
                results.count = lista.size();
            }
            else {
                // We perform filtering operation
                List<Cidade> nCidade = new ArrayList<Cidade>();

                for (Cidade c : lista) {
                    if (c.getCidade().toUpperCase().startsWith(constraint.toString().toUpperCase())){
                        nCidade.add(c);
                    }else{
                        nCidade.clear();
                    }
                }

                results.values = nCidade;
                results.count = nCidade.size();

            }
            return results;

        }

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


}

使用

代码语言:javascript
复制
List<Cidade> listaCidade = new ArrayList<Cidade>();
listaCidade.add(new Cidade("Guaira"));
listaCidade.add(new Cidade("Barretos"));
listaCidade.add(new Cidade("Franca"));
listaCidade.add(new Cidade("Ituverava"));

actvCidades = (AutoCompleteTextView)findViewById(R.id.acCidade);
actvCidade.setAdater(new CidadeListAdapter(this, listaCidade));
EN

回答 1

Stack Overflow用户

发布于 2015-03-24 10:23:47

您需要第二个列表,它将包含所有筛选的实体。

在“发布”方法中,可以将筛选后的值分配给该列表。

让筛选后的列表成为getView(..)方法的源。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28662241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档