10

私は、ユーザーが autoCompleteTextView に場所を入力できるこのアプリに取り組んでおり、ここで説明されているように、Google Places Api に基づいて場所を提案します。

ただし、ユーザーが一定時間入力を停止した場合にのみリクエストを送信することで、アプリが送信するリクエストの量を制限したいと思います。誰もこれを行う方法を知っていますか?

4

4 に答える 4

14

この回答に似ていますが、少し簡潔で、余分な状態を導入することはありません。performFilteringフィルタリングが実際に必要な場合にのみ呼び出されるため、しきい値チェックも必要ありません。

によって追加されたAutoCompleteTextViewものをオーバーライド/置換できないため、サブクラス化が唯一の方法のようです。TextWatcherAutoCompleteTextView

public class DelayAutoCompleteTextView extends AutoCompleteTextView {           
    public DelayAutoCompleteTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            DelayAutoCompleteTextView.super.performFiltering((CharSequence) msg.obj, msg.arg1);
        }
    };

    @Override
    protected void performFiltering(CharSequence text, int keyCode) {
        mHandler.removeMessages(0);
        mHandler.sendMessageDelayed(mHandler.obtainMessage(0, keyCode, 0, text), 750);
    }
}
于 2013-01-02T22:55:29.613 に答える
4

上記の問題の解決策を見つけましたが、これは非常にうまく機能しています。次の方法で AutoCompleteTextView を拡張しました。このコードをさらに改善する方法を知っている人がいたら教えてください。

public class MyAutoCompleteTextView extends AutoCompleteTextView {

// initialization
int threshold;
int delay = 750;
Handler handler = new Handler();
Runnable run;

// constructor
public MyAutoCompleteTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void performFiltering(final CharSequence text, final int keyCode) {
    // get threshold
    threshold = this.getThreshold();

    // perform filter on null to hide dropdown
    doFiltering(null, keyCode);

    // stop execution of previous handler
    handler.removeCallbacks(run);

    // creation of new runnable and prevent filtering of texts which length
    // does not meet threshold
    run = new Runnable() {
        public void run() {
            if (text.length() > threshold) {
                doFiltering(text, keyCode);
            }
        }
    };

    // restart handler
    handler.postDelayed(run, delay);
}

// starts the actual filtering
private void doFiltering(CharSequence text, int keyCode) {
    super.performFiltering(text, keyCode);
}

}
于 2012-11-03T15:09:41.103 に答える
0

TextWatcherを使用して、テキストエントリ間の時間を監視できます。私は個人的に、ネイティブのAndroidコントロールをサブクラス化するというアイデアは好きではありません(ただし、これは確かに有効なアプローチであり、私の好みのアプローチではありません)。

ドキュメント: http ://developer.android.com/reference/android/text/TextWatcher.html

およびSOリンク: AndroidでTextWatcherクラスを使用する方法は?

于 2012-11-03T15:35:05.053 に答える