我正在尝试创建一个可过滤到我的BaseAdapter的AutoCompleteTextView。我有一个名为Local的对象,我向这个对象添加了一些属性,例如:‘new Local("Guaira");new Local("Franca");new Local("Barretos")。如果我键入文本"Guaíra“,弹出窗口将不会打开以选择"Guaira",但如果我键入"Barretos”是打开的,并显示“Guaira”、"Franca“和"Barretos”。我不明白为什么不行。
我怎么能做到呢?
AutoCompleteTextView
<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
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();
}
}
}
}使用
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));发布于 2015-03-24 10:23:47
您需要第二个列表,它将包含所有筛选的实体。
在“发布”方法中,可以将筛选后的值分配给该列表。
让筛选后的列表成为getView(..)方法的源。
https://stackoverflow.com/questions/28662241
复制相似问题