87

AutoCompleteTextViewアクティビティで を使用し、ユーザーが Web API にクエリを実行してデータを入力したいと考えています。どうすればこれを行うことができますか?

新しいクラスを作成してオーバーライドAutoCompleteTextView.performFilteringするか、またはカスタム リスト アダプターを使用して、android.widget.FilterperformFiltering をオーバーライドするカスタムを提供しますか?

または、最終目標を達成するためのより良い方法はありますか?

少し似たようなことをしたことがありますが、それはクイック検索ボックス用で、サービスの実装が含まれていましたが、それはここでやりたいことではないと思います.

4

5 に答える 5

107

私は解決策を思いつきました。それが最善の解決策かどうかはわかりませんが、非常にうまく機能しているようです。私が行ったことは、ArrayAdapter を拡張するカスタム アダプターを作成することでした。カスタム アダプターでは、getFilter をオーバーライドし、performFiltering をオーバーライドする独自の Filter クラスを作成しました。これにより新しいスレッドが開始されるため、UI が中断されることはありません。以下はベアボーンの例です。

MyActivity.java

public class MyActivity extends Activity {
    private AutoCompleteTextView style;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        style = (AutoCompleteTextView) findViewById(R.id.style);
        adapter = new AutoCompleteAdapter(this, android.R.layout.simple_dropdown_item_1line); 
        style.setAdapter(adapter);
    }
}

AutoCompleteAdapter.java

public class AutoCompleteAdapter extends ArrayAdapter<Style> implements Filterable {
    private ArrayList<Style> mData;

    public AutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
        mData = new ArrayList<Style>();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Style getItem(int index) {
        return mData.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter myFilter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if(constraint != null) {
                    // A class that queries a web API, parses the data and returns an ArrayList<Style>
                    StyleFetcher fetcher = new StyleFetcher();
                    try {
                        mData = fetcher.retrieveResults(constraint.toString());
                    }
                    catch(Exception e) {
                        Log.e("myException", e.getMessage());
                    }
                    // Now assign the values and count to the FilterResults object
                    filterResults.values = mData;
                    filterResults.count = mData.size();
                }
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence contraint, FilterResults results) {
                if(results != null && results.count > 0) {
                notifyDataSetChanged();
                }
                else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return myFilter;
    }
}
于 2011-02-19T14:05:30.343 に答える
3

Chu: ビューの外観をカスタマイズし、オブジェクトのアンラップをより詳細に制御するには、次の操作を行います...

    @Override
    public View getView (int position, View convertView, ViewGroup parent) {
        TextView originalView = (TextView) super.getView(position, convertView, parent); // Get the original view

        final LayoutInflater inflater = LayoutInflater.from(getContext());
        final TextView view = (TextView) inflater.inflate(android.R.layout.simple_dropdown_item_1line, parent, false);

        // Start tweaking
        view.setText(originalView.getText());
        view.setTextColor(R.color.black);  // also useful if you have a color scheme that makes the text show up white
        view.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10); // override the text size
        return view;
    }
于 2011-04-22T04:13:13.647 に答える