2011-09-12 75 views
3

我剛剛實施了使用在線Web服務一個文本框的自動完成,在此基礎上回答#2: ArrayAdapter is updated late from Webservice in AutoCompleteTextAdapter轉換選擇爲String

使用一個ArrayAdapter<User> implements Filterable,我負責的是自動完成建議我按預期輸入。 User是一個Java Bean,它包含在建議(年齡,名稱,...)中提供的信息。

當我選擇一個建議時,自動填充字段將填充'錯誤'數據 - 使用toString()方法,而不是bean的'name'屬性。

我的問題是:我可以重寫(在適配器)一個方法,這將允許我指定如何轉換該bean,以便爲AutoCompleteTextView返回正確的屬性? (理想情況下,不應該改變User.toString())

Thx!

回答

2

我已經找到了另一種方式:在AutoCompleteTextView

方法convertSelectionToString(Object selectedItem)可以由子類重寫以支持自定義的轉換。這樣,不需要調整toString()方法。

這在我看來有一個好處,即Filter可以返回不僅僅是一個字符串列表,而是一個自定義對象列表,它可以被適配器的getView(int position, View convertView, ViewGroup parent)用來構建「更豐富」的建議。

一個明顯的缺點是,它需要爲每個不能修改toString()方法的Filterresult類型的AutoCompleteTextView子類化。

@Override 
protected CharSequence convertSelectionToString(Object selectedItem) { 
    if(selectedItem instanceof User){ 
     User u = (User) selectedItem; 
     return u.getUsername(); 
    } else { 
     return super.convertSelectionToString(selectedItem); 
    } 
} 

對此的評論?

+1

您可以創建子類AutoCompleteTextView,並添加一個方法 setCustomConvertSelectionToStringMethod(),它使用自定義的「toString」方法接受對象(接口) 在convertSelectionToString方法中,檢查customMethod並執行它,如果它存在... 這樣,必須子類化一次 – vanleeuwenbram

2

搜索結果取決於數據的toString()返回的內容。在你的情況下,你需要返回toString()實現中的name字段。

+0

是的,這也發生在我身上,但是我想知道是否有一個方法在適配器或另一個地方(除了toString的bean),我可以重寫代替。 – Patrick

+0

是的。你可以在'Filter'類的'performFiltering'方法中直接比較'constraint'和name字段。 – Ronnie

2

如果您從SimpleCursorAdapter繼承自己的適配器,則可以在構造器中的適配器上設置一個CursorToStringConverter

private class AutoCompleteAdapter extends SimpleCursorAdapter { 

    public AutoCompleteAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 

     /* Other setup code here */ 

     setCursorToStringConverter(new CursorToStringConverter() { 
      @Override 
      public CharSequence convertToString(Cursor item) { 
       return item.getString(item.getColumnIndex(DESIRED_COLUMN_NAME)); 
      } 
     }); 
    } 
} 
+0

在這種情況下,我不使用數據庫 - 但我一定會牢記未來!謝謝! – Patrick

7

沒有必要繼承AutoCompleteTextView並覆蓋convertSelectionToString方法。重寫convertResultToString方法可以實現同樣的效果,您可以在ArrayAdapter(已經劃分子類)的自定義Filter中找到該方法。

我有同樣的問題:我的ArrayAdapter中的自定義對象的toString()實現不是我能控制的東西。我實現了這樣的方法:

// In custom Filter implementation 

@Override 
public CharSequence convertResultToString(Object result) { 
    if(result instanceof MyCustomClass) { 
     return ((MyCustomClass) result).getAttribute("name"); 
    } 

    return super.convertResultToString(result); 
} 
+0

應被選爲答案。 – Pijusn