我想用一个AutoCompleteTextView
在我的活动中,并通过查询 Web API 在用户输入时填充数据。我该怎么做呢?
我是否创建一个新类并覆盖AutoCompleteTextView.performFiltering
,或者我是否使用自定义列表适配器并提供自定义android.widget.Filter
覆盖performFiltering?
或者有更好的方法来实现我的最终目标吗?
我已经做了一些类似的事情,但它是针对快速搜索框的,并且涉及实现服务,但我相信这不是我想要在这里做的。
我想出了一个解决方案,我不知道它是否是最好的解决方案,但它似乎工作得很好。我所做的是创建一个扩展 ArrayAdapter 的自定义适配器。在自定义适配器中,我重写了 getFilter 并创建了自己的 Filter 类来重写 PerformFiltering。这将启动一个新线程,因此不会中断 UI。下面是一个简单的例子。
我的活动.java
public class MyActivity extends Activity {
private AutoCompleteTextView style;
@Override
public void onCreate(Bundle savedInstanceState) {
...
style = (AutoCompleteTextView) findViewById(R.id.style);
adapter = new AutoCompleteAdapter(this, android.R.layout.simple_dropdown_item_1line);
style.setAdapter(adapter);
}
}
自动完成适配器.java
public class AutoCompleteAdapter extends ArrayAdapter<Style> implements Filterable {
private ArrayList<Style> mData;
public AutoCompleteAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
mData = new ArrayList<Style>();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Style getItem(int index) {
return mData.get(index);
}
@Override
public Filter getFilter() {
Filter myFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if(constraint != null) {
// A class that queries a web API, parses the data and returns an ArrayList<Style>
StyleFetcher fetcher = new StyleFetcher();
try {
mData = fetcher.retrieveResults(constraint.toString());
}
catch(Exception e) {
Log.e("myException", e.getMessage());
}
// Now assign the values and count to the FilterResults object
filterResults.values = mData;
filterResults.count = mData.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if(results != null && results.count > 0) {
notifyDataSetChanged();
}
else {
notifyDataSetInvalidated();
}
}
};
return myFilter;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)