2017-04-17 39 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進行過濾 –

相關問題