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 と同じ理由がわかりません。
String 配列を使用した単純なオートコンプリートを既に試しましたが、うまくいきましたが、カスタム オブジェクトを使用したこのカスタム オートコンプリートについて理解するのに苦労しています。どんな助けも大歓迎です!!
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;
}
}