我有一个按钮(setButton),按下按钮后,我希望修改后的AutoCompleteTextView显示下拉菜单
我有两个班级
AutoCompleteTextViewTest1Activity.class
package com.autocompletetextviewtest1;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
public class AutoCompleteTextViewTest1Activity extends Activity {
ArrayAdapter<String> adapter1;
ArrayAdapter<String> adapter2;
private InstantAutoComplete actv;
private String[] countries2 ={"Taiwan", "China", "S. Korea", "USA", "Japan", "Russia"};
private String[] countries={};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries);
adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countries2);
actv = (InstantAutoComplete)findViewById(R.id.actv);
actv.setAdapter(adapter1);
Button setButton = (Button)findViewById(R.id.setButton);
Button clearButton = (Button)findViewById(R.id.clearButton);
setButton.setOnClickListener(new OnClickListener(){
public void onClick(View v){
actv.setAdapter(adapter2);
actv.requestFocus();
}
});
clearButton.setOnClickListener(new OnClickListener(){
public void onClick(View v){
actv.setAdapter(adapter1);
}
});
}
}
和
InstantAutoComplete.class
package com.autocompletetextviewtest1;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;
public class InstantAutoComplete extends AutoCompleteTextView {
public InstantAutoComplete(Context context) {
super(context);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public InstantAutoComplete(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused) {
performFiltering(getText(), 0);
showDropDown();
}
}
}
但是我的AutoCompleteTextView在按下setButton时没有显示下拉菜单。我能做什么?谢谢!
答案 0 :(得分:0)
尝试在setButton onClick中调用actv.invalidate()以使用新更新的适配器刷新视图。
答案 1 :(得分:0)
这对我有用。请注意,我在适当的位置有日志,以检查我的webservice调用及其返回值。这对自动完成的工作至关重要。在您的情况下,您可能需要删除webservice调用并使用硬编码值自行填充适配器。
在onCreate中初始化
fromAutoComplete = new AutoComplete(this, R.layout.autocomplete_list_item);
fromAutoComplete.setNotifyOnChange(true);
fromAddress = (AutoCompleteTextView) findViewById(R.id.fromAddress);
fromAddress.setAdapter(fromAutoComplete);
fromAddress.setOnItemClickListener(this);
自动完成适配器,用于检查您的字符并反复调用Web服务,以显示在下拉列表中。
请注意,
- 此api需要一个google api密钥,您需要为自己生成密钥。也不要忘记为您的密钥启用Location API。没有它,不会工作。
- 将变量放在webservice调用中(出于某种疯狂的原因)。最后的传感器变量为我工作。随意从您的logcat上的提琴手或镀铬物上进行测试。
醇>
public AutoComplete(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
@Override
public int getCount() {
return resultList.size();
}
@Override
public String getItem(int index) {
return resultList.get(index);
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint != null) {
// Retrieve the autocomplete results.
resultList = autocomplete(constraint.toString());
// Assign the data to the FilterResults
filterResults.values = resultList;
filterResults.count = resultList.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
};
return filter;
}
private ArrayList<String> autocomplete(String input) {
ArrayList<String> resultList = null;
HttpURLConnection conn = null;
StringBuilder jsonResults = new StringBuilder();
try {
StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
sb.append("?key=" + API_KEY+"&sensor=false");
sb.append("&components=country:in");
sb.append("&input=" + URLEncoder.encode(input, "utf8"));
Log.d(LOG_TAG, "Calling "+sb.toString()) ;
URL url = new URL(sb.toString());
conn = (HttpURLConnection) url.openConnection();
InputStreamReader in = new InputStreamReader(conn.getInputStream());
// Load the results into a StringBuilder
int read;
char[] buff = new char[1024];
while ((read = in.read(buff)) != -1) {
jsonResults.append(buff, 0, read);
}
} catch (MalformedURLException e) {
Log.e(LOG_TAG, "Error processing Places API URL", e);
return resultList;
} catch (IOException e) {
Log.e(LOG_TAG, "Error connecting to Places API", e);
return resultList;
} finally {
if (conn != null) {
conn.disconnect();
}
}
try {
// Create a JSON object hierarchy from the results
JSONObject jsonObj = new JSONObject(jsonResults.toString());
JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");
// Extract the Place descriptions from the results
resultList = new ArrayList<String>(predsJsonArray.length());
for (int i = 0; i < predsJsonArray.length(); i++) {
resultList.add(predsJsonArray.getJSONObject(i).getString("description"));
}
} catch (JSONException e) {
Log.e(LOG_TAG, "Cannot process JSON results", e);
}
Log.d(LOG_TAG, resultList.size() + " in total returned.") ;
return resultList;
}
从下拉文本中选择项目
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Double latitude, longitude;
ArrayList<String> resultList = null;
HttpURLConnection conn = null;
StringBuilder jsonResults = new StringBuilder();
String str = (String) adapterView.getItemAtPosition(position);
try {
StringBuilder sb = new StringBuilder(
"http://maps.googleapis.com/maps/api/geocode/json?" + "address="
+ URLEncoder.encode(str, "utf-8") + "&sensor=true");
URL url = new URL(sb.toString());
Log.d("Taxeeta", url.toString() + " Called");
conn = (HttpURLConnection) url.openConnection();
InputStreamReader in = new InputStreamReader(conn.getInputStream());
// Load the results into a StringBuilder
int read;
char[] buff = new char[1024];
while ((read = in.read(buff)) != -1) {
jsonResults.append(buff, 0, read);
}
} catch (MalformedURLException e) {
Log.e("Taxeeta", "Error processing Places API URL", e);
} catch (IOException e) {
Log.e("Taxeeta", "Error connecting to Places API", e);
} finally {
if (conn != null) {
conn.disconnect();
}
}
try {
// Create a JSON object hierarchy from the results
JSONObject jsonObj = new JSONObject(jsonResults.toString());
JSONObject location = ((JSONObject) jsonObj.getJSONArray("results").get(0))
.getJSONObject("geometry").getJSONObject("location");
latitude = location.optDouble("lat");
longitude = location.optDouble("lng");
Log.d("Taxeeta", "Received Latitude " + latitude + ": Longitude" + longitude);
if (view.getId() == fromAddress.getId()) {
source = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6));
Log.d("Taxeeta", "Source Done");
} else {
destination = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6));
Log.d("Taxeeta", "Destination Done");
}
} catch (JSONException e) {
Log.e("Taxeeta", "Cannot process JSON results", e);
}
}