Android-AutoCompleteTextView仅在退格时工作
我有一个Android-AutoCompleteTextView仅在退格时工作,android,autocompletetextview,Android,Autocompletetextview,我有一个AutoCompleteTextView,可以根据用户类型动态更新建议列表。我的问题是,当我键入时,列表会更新,但下拉列表不会显示!但是当我删除一个字符(退格)时,下拉列表就会出现 我甚至尝试显式调用自动图文集.showDropDown()在文本更改后,但它不起作用 这是我的文本更改列表: private TextWatcher textChecker = new TextWatcher() { @Override public void beforeTextChange
AutoCompleteTextView
,可以根据用户类型动态更新建议列表。我的问题是,当我键入时,列表会更新,但下拉列表不会显示!但是当我删除一个字符(退格)时,下拉列表就会出现
我甚至尝试显式调用自动图文集.showDropDown()代码>在文本更改后,但它不起作用
这是我的文本更改列表
:
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");
}
}
};
我甚至尝试在自动图文集.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);
}
}
}
注意
问题是:我键入一个地址。我打字时什么也没显示。但我在logcat中看到适配器已更新。但是下拉列表没有显示。然后,当我删除一个字符时,会出现下拉列表 这可能与主线程中未调用自动图文集.showDropDown()
有关。或许您可以尝试这样做:
autoText.getHandler().post(new Runnable() {
@Override
public void run() {
autoText.showDropDown();
}
})
看起来您真的需要实现一个过滤器:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Filter;
import android.widget.TextView;
public class TestDoctor extends Activity {
TextView latText;
TextView lngText;
AutoCompleteTextView autoText;
ArrayAdapter<String> adapter;
private Filter filter;
private static final int ADDRESS_TRESHOLD = 10;
@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 AdapterUpdaterTask().execute();
}
});
autoText.setThreshold(ADDRESS_TRESHOLD);
autoText.setHint("Οδός Αριθμός, Περιοχή");
filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.i("Filter",
"Filter:" + constraint + " thread: " + Thread.currentThread());
if (constraint != null && constraint.length() > ADDRESS_TRESHOLD) {
Log.i("Filter", "doing a search ..");
new AdapterUpdaterTask().execute();
}
return null;
}
};
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line) {
public android.widget.Filter getFilter() {
return filter;
}
};
autoText.setAdapter(adapter);
adapter.setNotifyOnChange(false);
}
@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 AdapterUpdaterTask 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");
adapter.notifyDataSetChanged();
autoText.showDropDown();
}
super.onPostExecute(aVoid);
}
}
}
import java.io.InputStream;
导入java.util.ArrayList;
导入java.util.List;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.AutoCompleteTextView;
导入android.widget.Button;
导入android.widget.Filter;
导入android.widget.TextView;
公共类TestDoctor扩展了活动{
文本视图latText;
文本视图lngText;
自动完成文本视图自动图文集;
阵列适配器;
专用滤波器;
私有静态最终整数地址\u TRESHOLD=10;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.test_doctor);
latText=(TextView)findViewById(R.id.latTextView);
lngText=(TextView)findViewById(R.id.longTextView);
自动图文集=(AutoCompleteTextView)findViewById(R.id.AutoCompleteTextView);
Button Button=(Button)findViewById(R.id.buttonDoctor);
button.setOnClickListener(新建button.OnClickListener(){
公共void onClick(视图v){
新建AdapterUpdaterTask().execute();
}
});
自动图文集.setThreshold(地址\u TRESHOLD);
自动图文集.setHint(“БΔόςΑριθμό,περιχή”);
过滤器=新过滤器(){
@凌驾
受保护的无效发布结果(CharSequence约束,
FilterResults(结果){
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
Log.i(“过滤器”,
过滤器:“+constraint+”线程:“+thread.currentThread());
if(constraint!=null&&constraint.length()>ADDRESS\u TRESHOLD){
Log.i(“过滤器”、“进行搜索…”);
新建AdapterUpdaterTask().execute();
}
返回null;
}
};
适配器=新阵列适配器(此,
android.R.layout.simple\u下拉菜单\u项目\u 1行){
public android.widget.Filter getFilter(){
回流过滤器;
}
};
自动图文集.setAdapter(适配器);
adapter.setNotifyOnChange(false);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
私有列表getAddressesFromText(字符串地址){
地址=地址。替换(“”,“+”);
HttpHelper HttpHelper=新的HttpHelper();
InputStream InputStream=httpHelper
.makeHttpGetRequest(“http://maps.google.com/maps/api/geocode/json?address="
+地址+“&sensor=false”);
字符串响应=httpHelper.inputStreamToString(inputStream);
List simpleAddresses=new ArrayList();
试一试{
JSONObject JSONObject=新JSONObject(响应);
int size=((JSONArray)jsonObject.get(“结果”)).length();
对于(int i=0;i0){
适配器。清除();
Log.i(“适配器大小”,“大小+”);
对于(int i=0;i
您可以尝试adapter.setNotifyOnChange(false),然后在onPostExecute()的末尾手动调用adapter.notifyDataSetChanged()。我只需要
autoText.getHandler().post(new Runnable() {
@Override
public void run() {
autoText.showDropDown();
}
})
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Filter;
import android.widget.TextView;
public class TestDoctor extends Activity {
TextView latText;
TextView lngText;
AutoCompleteTextView autoText;
ArrayAdapter<String> adapter;
private Filter filter;
private static final int ADDRESS_TRESHOLD = 10;
@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 AdapterUpdaterTask().execute();
}
});
autoText.setThreshold(ADDRESS_TRESHOLD);
autoText.setHint("Οδός Αριθμός, Περιοχή");
filter = new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.i("Filter",
"Filter:" + constraint + " thread: " + Thread.currentThread());
if (constraint != null && constraint.length() > ADDRESS_TRESHOLD) {
Log.i("Filter", "doing a search ..");
new AdapterUpdaterTask().execute();
}
return null;
}
};
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_dropdown_item_1line) {
public android.widget.Filter getFilter() {
return filter;
}
};
autoText.setAdapter(adapter);
adapter.setNotifyOnChange(false);
}
@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 AdapterUpdaterTask 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");
adapter.notifyDataSetChanged();
autoText.showDropDown();
}
super.onPostExecute(aVoid);
}
}
}