私は、ユーザーが autoCompleteTextView に場所を入力できるこのアプリに取り組んでおり、ここで説明されているように、Google Places Api に基づいて場所を提案します。
ただし、ユーザーが一定時間入力を停止した場合にのみリクエストを送信することで、アプリが送信するリクエストの量を制限したいと思います。誰もこれを行う方法を知っていますか?
私は、ユーザーが autoCompleteTextView に場所を入力できるこのアプリに取り組んでおり、ここで説明されているように、Google Places Api に基づいて場所を提案します。
ただし、ユーザーが一定時間入力を停止した場合にのみリクエストを送信することで、アプリが送信するリクエストの量を制限したいと思います。誰もこれを行う方法を知っていますか?
この回答に似ていますが、少し簡潔で、余分な状態を導入することはありません。performFiltering
フィルタリングが実際に必要な場合にのみ呼び出されるため、しきい値チェックも必要ありません。
によって追加されたAutoCompleteTextView
ものをオーバーライド/置換できないため、サブクラス化が唯一の方法のようです。TextWatcher
AutoCompleteTextView
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);
}
}
上記の問題の解決策を見つけましたが、これは非常にうまく機能しています。次の方法で 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);
}
}
TextWatcherを使用して、テキストエントリ間の時間を監視できます。私は個人的に、ネイティブのAndroidコントロールをサブクラス化するというアイデアは好きではありません(ただし、これは確かに有効なアプローチであり、私の好みのアプローチではありません)。
ドキュメント: http ://developer.android.com/reference/android/text/TextWatcher.html
およびSOリンク: AndroidでTextWatcherクラスを使用する方法は?