1

ジオコーダーを使用して Android で簡単な住所のオートコンプリートを取得するために、私は忍耐を試み、最終的に助けを求めることにしました。

元のコード参照 : Android のジオコーダー オートコンプリート

したがって、以下のコードでは、ユーザーが autoCompleteTextView に入力したときに住所をオートコンプリートしようとしているだけです。ユーザーが入力したときにUIがフリーズしないことを期待して、runOnUiThreadで実際の作業を行う関数を呼び出しています。ただし、しきい値(3文字)の後にUIがフリーズし、可能なアドレスのドロップダウンが独自に表示されますペースであり、常にではありません。

どこが間違っているのか教えていただければ....よろしくお願いします

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;

public class AlarmActivity extends Activity implements TextWatcher {
private static final int THRESHOLD = 3;
private String latitude, longitude;
private List<Address> autoCompleteSuggestionAddresses;
private ArrayAdapter<String> autoCompleteAdapter;



/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.hw);
    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
    autoCompleteAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, new ArrayList<String>());
    autoCompleteAdapter.setNotifyOnChange(false);
    AutoCompleteTextView locationinput = (AutoCompleteTextView) findViewById(R.id.locationInput);
    locationinput.addTextChangedListener(this);
    locationinput.setOnItemSelectedListener(this);
    locationinput.setThreshold(THRESHOLD);
    locationinput.setAdapter(autoCompleteAdapter);

}

@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {

}

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
final String value = arg0.toString();

if (!"".equals(value) && value.length() >= THRESHOLD) {

    Thread t = new Thread() {
        public void run() {
            try {

                runOnUiThread(new Runnable() {
                    public void run() {
                        notifyResult(value);
                    }
                });
            } catch (Exception e) {}
        }
    };
    t.start();


} else {
    autoCompleteAdapter.clear();
}
}

@Override
public void afterTextChanged(Editable arg0) {
}


private void notifyResult(String value) {
     try {
            autoCompleteSuggestionAddresses = new Geocoder(getBaseContext()).getFromLocationName(value, 10);

            //notifyResult(autoCompleteSuggestionAddresses);

            latitude = longitude = null;
            autoCompleteAdapter.clear();
            for (Address a : autoCompleteSuggestionAddresses) {
                Log.v("Nohsib", a.toString());
                String temp = ""+ a.getFeatureName()+" "+a.getCountryName()+" "+a.getPostalCode();  

                autoCompleteAdapter.add(temp);
            }
            autoCompleteAdapter.notifyDataSetChanged();



        } catch (IOException ex) {
          //  Log.e(GeoCoderAsyncTask.class.getName(), "Failed to get autocomplete suggestions", ex);
        }

}

}

4

1 に答える 1