2017-04-17 17 views

回答

0

嗯,首先,你需要使用一个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); 

    ... 
} 

下面是如何构建自定义适配器的模板,该载荷数据任何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; 
    } 
} 

当然,您将需要重构上面的代码以满足自己的需求。

+0

我会做一个函数,抓取我的搜索结果,并将它们放在一个隐藏的ArrayList中,然后我将使用上面的代码使它从已经解析的数据中搜索来获得我想要的结果。但是,如果数据库规模很大,这不会是不好的做法。 – Elias

+0

总是要向API发出获取请求,您必须设置LIMIT,但它会干扰结果,因为查询不在隐藏的ArrayList上。因此,在这种情况下最好的做法是向API发出请求,直到结果大于LIMIT,并且结果小于LIMIT时,可以停止执行Web请求,并且只对您隐藏的ArrayList进行过滤 –

相关问题