我无法在 AutoCompleteTextView 中显示自动完成建议。
这是文本视图:
<AutoCompleteTextView
android:id="@+id/atvAddContact"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white" />
这就是我设置适配器的方式:
ArrayList<Contacto> list = cc.getContactosList("");
ContactosAdapter2 adapter = new ContactosAdapter2(this, R.layout.contact_list_item, list);
adapter.notifyDataSetChanged();
现在对于棘手的部分,这是我的适配器,它是一个完整工作的 ListView 适配器的副本(具有相同的列表项),但它实现了 Filterable,它现在不过滤并且应该显示所有结果,但它什么也没显示。设置到适配器的 ArrayList 充满了项目,所以数据就在那里。
我的 getFilter() 方法虽然从未被调用,但我不知道为什么,与 getView 相同。
我已经尝试了一个带有字符串数组的简单自动完成功能并且它有效,但是我无法理解这个带有自定义对象的自定义自动完成功能,欢迎提供任何帮助!
import java.util.ArrayList;
import com.android.proj.R;
import com.android.proj.datas.Contacto;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;
public class ContactosAdapter2 extends ArrayAdapter<Contacto> implements Filterable{
Context context;
int layoutResourceId;
ArrayList<Contacto> data = new ArrayList<Contacto>();
public ContactosAdapter2(Context context, int layoutResourceId, ArrayList<Contacto> data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}
@Override
public Filter getFilter()
{
Filter myFilter = new Filter()
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
FilterResults filterResults = new FilterResults();
if(constraint != null)
{
filterResults.values = data;
filterResults.count = data.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results)
{
if(results != null && results.count > 0)
{
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}
};
return myFilter;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ContactoHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ContactoHolder();
holder.contactoNombre = (TextView)row.findViewById(R.id.tvContactoNombre);
holder.contactoInfo = (TextView)row.findViewById(R.id.tvContactoInfo);
holder.contactoImg = (ImageView)row.findViewById(R.id.ivContactoImg);
row.setTag(holder);
}
else
{
holder = (ContactoHolder)row.getTag();
}
Contacto ap = data.get(position);
holder.contactoNombre.setText(ap.getNombre());
byte[] baImage = ap.getBaImage();
if (baImage == null)
holder.contactoImg.setImageURI(ap.getPhoto());
else
holder.contactoImg.setImageBitmap(BitmapFactory.decodeByteArray(baImage, 0, baImage.length));
if (ap.getNumber().length() > 0 && ap.getNumber().charAt(0) == '#')
holder.contactoInfo.setText(ap.getNumber().substring(1, ap.getNumber().length()));
else
holder.contactoInfo.setText(ap.getNumber());
return row;
}
static class ContactoHolder
{
TextView contactoNombre;
TextView contactoInfo;
ImageView contactoImg;
}
}