ユーザーの入力に応じてAutoCompleteTextView
提案のリストを動的に更新する があります。私の問題は、入力するとリストが更新されますが、ドロップダウンが表示されないことです! しかし、文字を削除すると (バックスペース)、ドロップダウンが表示されます!
テキストの変更後に を明示的に呼び出そうとしましautoText.showDropDown();
たが、機能しません。
これが私のものTextChangedListener
です:
private TextWatcher textChecker = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if(autoText.length()>9){
new GeoTask().execute();
}
}
@Override
public void afterTextChanged(Editable editable) {
if(autoText.length()>9){
autoText.showDropDown();
Log.i("UPDATE","showDropDown");
}
}
};
上記のアダプターをリセットしようとしましたautoText.showDropDown();
が、それでも何もしません:
autoText.setAdapter(null);
autoText.setAdapter(adapter);
それを機能させる方法はありますか?
編集: アクティビティの完全なコードは次のとおりです。おそらく誰かが私が間違っていることを見つけることができます...
public class TestDoctor extends Activity {
TextView latText;
TextView lngText;
AutoCompleteTextView autoText;
ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_doctor);
latText = (TextView) findViewById(R.id.latTextView);
lngText = (TextView) findViewById(R.id.longTextView);
autoText = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView);
Button button = (Button) findViewById(R.id.buttonDoctor);
button.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
new GeoTask().execute();
}
});
autoText.setThreshold(10);
autoText.setHint("Οδός Αριθμός, Περιοχή");
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
autoText.setAdapter(adapter);
adapter.setNotifyOnChange(true);
autoText.addTextChangedListener(textChecker);
}
private TextWatcher textChecker = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3){}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) {
if(autoText.length()>9){
new GeoTask().execute();
}
}
@Override
public void afterTextChanged(Editable editable) {}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private List<SimpleAddress> getAddressesFromText(String address) {
address = address.replace(' ', '+');
HttpHelper httpHelper = new HttpHelper();
InputStream inputStream = httpHelper.makeHttpGetRequest("http://maps.google.com/maps/api/geocode/json?address=" + address + "&sensor=false");
String response = httpHelper.inputStreamToString(inputStream);
List<SimpleAddress> simpleAddresses = new ArrayList<SimpleAddress>();
try {
JSONObject jsonObject = new JSONObject(response);
int size = ((JSONArray) jsonObject.get("results")).length();
for (int i = 0; i<size; i++){
String formatted_address = ((JSONArray) jsonObject.get("results")).getJSONObject(i)
.getString("formatted_address");
Double lng = ((JSONArray) jsonObject.get("results")).getJSONObject(i)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lng");
Double lat = ((JSONArray) jsonObject.get("results")).getJSONObject(i)
.getJSONObject("geometry").getJSONObject("location")
.getDouble("lat");
simpleAddresses.add(i,new SimpleAddress(formatted_address,lat,lng));
}
return simpleAddresses;
} catch (JSONException e) {
return null;
}
}
public class GeoTask extends AsyncTask<Void, Void, Void> {
List<SimpleAddress> simpleAddresses = new ArrayList<SimpleAddress>();
@Override
protected Void doInBackground(Void... voids) {
Log.i("UPDATE","1");
try {
simpleAddresses = getAddressesFromText(autoText.getText().toString());
} catch (NullPointerException e) {
}
Log.i("UPDATE","2");
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
Log.i("UPDATE", "3");
int size = simpleAddresses.size();
if(size > 0){
adapter.clear();
Log.i("ADAPTER_SIZE",""+size);
for (int i = 0; i< size; i++){
adapter.add(simpleAddresses.get(i).getFormatted_address());
Log.i("ADDED",simpleAddresses.get(i).getFormatted_address());
}
Log.i("UPDATE","4");
autoText.setAdapter(null);
autoText.setAdapter(adapter);
autoText.showDropDown();
Log.i("UPDATE","showDropDown");
}
super.onPostExecute(aVoid);
}
}
}
EDIT 2 これも試しましたが、それでも機能しません。ドロップダウンは、バックスペースを押したときにのみ表示されます...
@Override
public void afterTextChanged(Editable editable) {
runOnUiThread(updateAdapter);
}
...
private Runnable updateAdapter = new Runnable() {
public void run(){
Log.i("ADAPTER_UPDATE","start");
adapter.notifyDataSetChanged();
autoText.showDropDown();
Log.i("ADAPTER_UPDATE","end");
}
};
注 問題は次のとおりです。アドレスを入力します。入力しても何も表示されません。しかし、logcat でアダプターが更新されていることがわかります。しかし、ドロップダウンは表示されません。次に、1文字を削除すると、ドロップダウンが表示されます??!!