1
我在AutoCompleteTextView中显示自动填充建议时遇到问题。在自定义适配器中使用可自动完成的可筛选
这里是TextView的:
<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;
}
}