2011-03-02 31 views
3

什麼,我試圖做的是和失敗草草收場是這樣的:Android的正確的方式,如果在實施過濾自動完成

在我看來,我有一個自動完成的TextView。 我想通過GET獲取一個json數組對象。全程約1-2秒... (我應該使用的AsyncTask或處理程序來支持這種獲取?)

基於此數組然後過濾用戶的輸入。

目前,我已經實現了我的自定義適配器等等...

public class StationAdapter extends BaseAdapter implements Filterable { 

Context _ctx; 
//returned stations... 
ArrayList<Station> _stations; 

// to hold original stations... 
private ArrayList<Station> orig; 

//Custom filter to be used 
private final StationFilter filter; 

public StationAdapter(final Context ctx, final ArrayList<Station> stations) { 
    this._ctx = ctx; 
    this._stations = stations; 
    this.orig = stations; 
    this.filter = new StationFilter(); 
} 

@Override 
public int getCount() { 
    if (_stations != null) 
     return _stations.size(); 
    else 
     return 0; 
} 

@Override 
public Object getItem(final int position) { 
    return _stations.get(position); 
} 


//IS unused? NO whats its real purpose ?... 
@Override 
public long getItemId(final int position) { 
    return (position); 
} 


@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) { 
    StationView sv; 
    if (convertView == null) 
     sv = new StationView(_ctx, _stations.get(position)); 
    else { 
     sv = (StationView) convertView; 
     sv.setCode(_stations.get(position).mCode); 
     sv.setName(_stations.get(position).mName); 
    } 
    return sv; 
} 

@Override 
public Filter getFilter() { 
    return filter; 
} 

private class StationFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(final CharSequence constraint) { 

     final FilterResults oReturn = new FilterResults(); 
     final ArrayList<Station> results = new ArrayList<Station>(); 
     if (orig == null) 
      orig = _stations; 
     if (constraint != null) { 
      if (orig != null && orig.size() > 0) { 
       for (final Station g : orig) { 
        if (g.mName.contains(constraint.toString().toUpperCase())) 
         results.add(g); 
       } 
      } 
      oReturn.values = results; 
     } 
     return oReturn; 

    } 

    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(final CharSequence constraint, final FilterResults results) { 
     _stations = (ArrayList<Station>) results.values; 
     notifyDataSetChanged(); 
    } 
} 

}

出於某種原因,過濾響應每觸發其它輸入鍵我main.xml中看起來簡直像這樣.. 。

 <AutoCompleteTextView android:id="@+id/search_stations" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:lines="1" 
     android:singleLine="true"   
     /> 

有人能指出我在做什麼錯誤的,一些教程,這樣的用例處理

在此先感謝

回答

0

這是非常晚,但我相信這是預期的行爲。過濾邏輯會在另一個請求傳出時對請求排隊。所以,如果你輸入「a」,它將會取得結果,並且之後的任何字母將等待,直到「a」的結果回來。這些結果返回後,將發出新請求,等等。

0

薩拉姆 我找到了解決辦法 這裏是代碼,你必須做出

if (constraint != null) { 
       if (orig != null && orig.size() > 0) { 
        for (final station g : orig) { 
         if (g.getName().toLowerCase() 
           .contains(constraint.toString())) 
          results.add(g); 
        } 
       } 
       oReturn.values = results; 
      } 
相關問題