如何在我的android应用程序中创建一个实时查询字段来查询我的MYSQL数据库,而无需按search
我有一个可以工作的搜索功能,可以将搜索结果插入微调器,但我希望它能够像谷歌一样,不需要按下搜索按钮就可以运行。如何在我的android应用程序中创建一个实时查询字段来查询我的MYSQL数据库,而无需按search,android,mysql,search,Android,Mysql,Search,我有一个可以工作的搜索功能,可以将搜索结果插入微调器,但我希望它能够像谷歌一样,不需要按下搜索按钮就可以运行。 类似这样的内容:我觉得你需要的是一个改变了上下文的侦听器看看这里首先,你需要使用一个AutoCompleteTextView,它在每次文本改变时触发一个过滤器,并将建议完全显示为你附加的图像 然后,您必须是自定义适配器,并将其添加到活动的onCreate函数中的视图中: protected void onCreate(Bundle savedInstanceState) { .
类似这样的内容:我觉得你需要的是一个改变了上下文的侦听器看看这里首先,你需要使用一个AutoCompleteTextView,它在每次文本改变时触发一个过滤器,并将建议完全显示为你附加的图像 然后,您必须是自定义适配器,并将其添加到活动的onCreate函数中的视图中:
protected void onCreate(Bundle savedInstanceState) {
...
AutomaticSearchAdapter adapter = new AutomaticSearchAdapter(this, new ArrayList<CustomObject>(), "");
listView = (AutoCompleteTextView) findViewById(R.id.search_complete);
listView.setThreshold(1);
listView.setAdapter(adapter);
...
}
创建时受保护的void(Bundle savedInstanceState){
...
AutomaticSearchAdapter=新的AutomaticSearchAdapter(这是新的ArrayList(),“”);
listView=(AutoCompleteTextView)findViewById(R.id.search\u complete);
设置阈值(1);
setAdapter(适配器);
...
}
下面是一个模板,说明如何构建自定义适配器,该适配器从任何API加载数据,并根据自己的筛选条件进行建议
public class AutomaticSearchAdapter extends ArrayAdapter implements AsyncResponse, Filterable {
private ArrayList<ContactItem> realList; // The list that will be shown
private ArrayList<CustomObject> results = new ArrayList<CustomObject> (); // A list with all data from your API
private Filter mFilter = new Filter(){
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if(constraint != null) {
String constraintTrim = ContactSearchAdapter.toPlain(constraint.toString()).trim().toLowerCase();
// When te user introduces at least 3 characteres, get data from your API
if (constraintTrim.length() == 3) {
// Call Here to you API, and populate results
}
ArrayList<CustomObject> suggestions = new ArrayList<CustomObject> ();
for (CustomObject object : results) {
if(/*some condition on your downloaded datum */) {
suggestions.add(object);
}
}
filterResults.values = suggestions;
filterResults.count = suggestions.size();
}
return filterResults;
}
@Override
protected void publishResults(CharSequence contraint, FilterResults results) {
if(results == null){
return;
}
try {
realList.clear();
if (results.values != null){
realList.addAll((List<CustomObject>) results.values);
}
notifyDataSetChanged();
}catch ( Exception e) {
}
}
};
public int getCount() {
return realList.size();
}
@Override
public Object getItem(int position) {
try {
if (realList.size() > 0 ) {
return realList.get(position);
}else {
return null;
}
}catch (Exception ex) {
return null;
}
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// HERE MUST BE YOUR CUSTOM getView FROM YOUR LIST
// YOU CAN LEARN MORE ABOUT http://androidexample.com/How_To_Create_A_Custom_Listview_-_Android_Example/index.php?view=article_discription&aid=67
return convertView;
}
@Override
public void postStart() {
//Nothing to do.
}
@Override
public Filter getFilter() {
return mFilter;
}
}
公共类自动搜索适配器扩展ArrayAdapter实现异步响应,可过滤{
private ArrayList realList;//将显示的列表
private ArrayList results=new ArrayList();//包含API中所有数据的列表
专用过滤器mFilter=新过滤器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
if(约束!=null){
String constraintTrim=ContactSearchAdapter.toPlain(constraint.toString()).trim().toLowerCase();
//当te用户引入至少3个字符时,从API获取数据
if(constraintTrim.length()=3){
//在这里调用API,并填充结果
}
ArrayList建议=新建ArrayList();
用于(自定义对象:结果){
如果(/*下载数据上的某些条件*/){
建议。添加(对象);
}
}
filterResults.values=建议;
filterResults.count=建议.size();
}
返回过滤器结果;
}
@凌驾
受保护的void publishResults(CharSequence Contrint、FilterResults结果){
如果(结果==null){
返回;
}
试一试{
realList.clear();
如果(results.values!=null){
addAll((List)results.values);
}
notifyDataSetChanged();
}捕获(例外e){
}
}
};
public int getCount(){
返回realList.size();
}
@凌驾
公共对象getItem(int位置){
试一试{
if(realList.size()>0){
返回realList.get(位置);
}否则{
返回null;
}
}捕获(例外情况除外){
返回null;
}
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
//这里必须是您列表中的自定义getView
//你可以了解更多关于http://androidexample.com/How_To_Create_A_Custom_Listview_-_Android_Example/index.php?view=article_discription&aid=67
返回视图;
}
@凌驾
public void postStart(){
//无事可做。
}
@凌驾
公共过滤器getFilter(){
返回过滤器;
}
}
当然,您需要根据自己的需求重构上述代码。是否需要类似的东西?我将创建一个函数来获取我的搜索结果并将它们放入一个隐藏的ArrayList中,然后我将使用上面的代码从已经解析的数据中进行搜索,以获得我想要的结果。但是,如果数据库的大小很大,这不是一种不好的做法吗?如果总是向API发出get请求,则必须设置一个限制,但这会干扰结果,因为查询不会位于隐藏的ArrayList上。因此,在这种情况下,最好的做法是向API发出请求,直到结果大于限制,当结果小于限制时,您可以停止执行web请求,只在隐藏的ArrayList上进行过滤