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 と同じ理由がわかりません。

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;
}
}
4

1 に答える 1

0

(質問編集でOPが回答。コミュニティwikiの回答に変換。回答がない質問を参照してください。ただし、コメントで問題が解決しました(またはチャットで拡張されました)

OP は次のように書いています。

これは確かに非常にばかげていましたが、AutoCompleteTextView に使用するアダプターを示していませんでした。欠落しているコードは次のとおりです。

atvAddContact.setAdapter(adapter);
于 2015-01-30T20:08:11.933 に答える