Геокодер автозаполнение в Android

Я гуглил свою задницу, пытаясь найти кого-то, у кого была такая же проблема, как и у меня, без удачи. Итак, вот моя проблема:

Я пытаюсь реализовать автоматическое предложение адресов, когда пользователь вводит название места с помощью геокодера в Android. Я хочу, чтобы это вело себя так же, как версия javascript с использованием combbox.

Я использую макет с AutoCompleteTextView и массив адаптера для динамического обновления списка предложений по мере ввода пользователем. Я добавил задержку в 500 мс с момента получения события onTextChanged () перед вызовом geocoder.getFromLocationName с использованием обработчика. Если пользователь вводит больше букв в течение 500 мс, последнее событие будет отменено. Проблема, с которой я сталкиваюсь, заключается в том, что предложения почти никогда не отображаются в пользовательском интерфейсе в виде выбираемых в раскрывающемся списке. Я получаю предложения с адресами, но когда я добавляю их в адаптер, присоединенный к autocomplatetextview, они просто не отображаются.

Я запускаю это на эмуляторе, используя API уровня 7, с включенным Google Apis.

Теперь немного исходного кода, чтобы помочь вам: Макет:

<LinearLayout android:id="@+id/searchInputLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="6dip"
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/searchMessage" />
    <EditText android:id="@+id/freetextInput" 
        android:hint="@string/searchFreetextLabel"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:background="@android:drawable/editbox_background" />
    <CheckBox android:id="@+id/includeVincinityCheckbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/includeVincinityLabel"
        android:checked="true"
        android:onClick="includeVincinityClick" />
    <AutoCompleteTextView android:id="@+id/locationInput" 
        android:hint="@string/locationInputHint"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" />
    <Button android:id="@+id/searchButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/searchBtnLabel" 
        android:onClick="searchBtnClicked" />
    </LinearLayout>

Исходный код моей деятельности (код не указан):

public class SearchLocationTabActivity extends Activity implements TextWatcher, OnItemSelectedListener {

private static final int MESSAGE_TEXT_CHANGED = 0;
private static final int AUTOCOMPLETE_DELAY = 500;
private static final int THRESHOLD = 3;
private String latitude, longitude;
private List<Address> autoCompleteSuggestionAddresses;
private ArrayAdapter<String> autoCompleteAdapter;
private Handler messageHandler;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.search);
    setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);

    messageHandler = new MyMessageHandler(this, this);
    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) {
    messageHandler.removeMessages(MESSAGE_TEXT_CHANGED);
}

@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
String value = arg0.toString();
if (!"".equals(value) && value.length() >= THRESHOLD) {
    Message msg = Message.obtain(messageHandler, MESSAGE_TEXT_CHANGED, arg0.toString());
    messageHandler.sendMessageDelayed(msg, AUTOCOMPLETE_DELAY);
} else {
    autoCompleteAdapter.clear();
}
}

@Override
public void afterTextChanged(Editable arg0) {
}

@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    if (arg2 < autoCompleteSuggestionAddresses.size()) {
        Address selected = autoCompleteSuggestionAddresses.get(arg2);
        latitude = Double.toString(selected.getLatitude());
        longitude = Double.toString(selected.getLongitude());
    }
}

private void notifyResult(List<Address> suggestions) {
    latitude = longitude = null;
    autoCompleteAdapter.clear();
    for (Address a : autoCompleteSuggestionAddresses) {
        autoCompleteAdapter.add(a.toString());//TODO: figure out a nice way to display this address in list
    }
    autoCompleteAdapter.notifyDataSetChanged();
}

@Override
public void onNothingSelected(AdapterView<?> arg0) {
    latitude = longitude = null;
}

private class MyMessageHandler extends Handler {

    private Context context;
    private AsyncTaskSubscriber subscriber;

    public MyMessageHandler(Context context, AsyncTaskSubscriber subscriber) {
        this.context = context;
        this.subscriber = subscriber;
    }

    @Override
    public void handleMessage(Message msg) {
        if (msg.what == MESSAGE_TEXT_CHANGED) {
            String enteredText = (String) msg.obj;

            try {
                autoCompleteSuggestionAddresses = new Geocoder(context).getFromLocationName(enteredText, 10);

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

Любая помощь высоко ценится!

Ответы на вопрос(3)

Ваш ответ на вопрос