0

我要讓這樣的定製AutoCompleteView Facebook的評論欄..定製AutoCompletevView像機器人

enter image description here

當你鍵入@B當我加入特殊字符應該填充(如Facebook ..那麼所有以'B'開頭的朋友都將被填充,我們可以選擇名字)。

在輸入'@'之前不應該填充它。

當添加'@'時,autocomplete被刪除,我們可以選擇名稱,選擇它後會被追加。

enter image description here

我發現this,但並不滿足。我需要線索。他們已經實現了...就像當你輸入'@'下拉填充。但我必須定製更多。現在我需要幫助,如果其他人有想法或任何未完成的來源。

我必須嘗試自己,但讓我問在實現customview來節省我的時間之前。

回答

2

您必須通過擴展類來創建自定義的自動完成視圖。並且需要更改您的問題中提到的代碼。

public class CustomAutoComplete extends AutoCompleteTextView { 
private String previous = ""; 
private String seperator = "@"; 
boolean isState = false; 

public CustomAutoComplete(final Context context, final AttributeSet attrs, 
     final int defStyle) { 
    super(context, attrs, defStyle); 
    this.setThreshold(1); 

} 

public CustomAutoComplete(final Context context, final AttributeSet attrs) { 
    super(context, attrs); 
    this.setThreshold(1); 
} 

public CustomAutoComplete(final Context context) { 
    super(context); 
    this.setThreshold(1); 
} 

/** 
* This method filters out the existing text till the separator and launched 
* the filtering process again 
*/ 
@Override 
protected void performFiltering(final CharSequence text, final int keyCode) { 
    String filterText = text.toString().trim(); 
    String lastchar = filterText.substring(filterText.length() - 1, 
      filterText.length()); 
    if (filterText.length() == 1) { 
     if (lastchar.equals(seperator)) { 
      isState = true; 
     } else { 
      isState = false; 
     } 
    } 
    previous = filterText.substring(0, 
      filterText.lastIndexOf(getSeperator()) + 1); 

    filterText = filterText.substring(filterText 
      .lastIndexOf(getSeperator()) + 1); 

    if ((lastchar.equals(seperator)) || isState) { 
     super.performFiltering(filterText, keyCode); 

     isState = true; 

    } 
} 

/** 
* After a selection, capture the new value and append to the existing text 
*/ 
@Override 
protected void replaceText(final CharSequence text) { 
    isState = false; 
    super.replaceText(previous + text);// + getSeperator()); 

} 

public String getSeperator() { 
    return seperator; 
} 

public void setSeperator(final String seperator) { 
    this.seperator = seperator; 
} 

} 

希望這將幫助你...

+0

會做..謝謝..讓我修改和擴展更多.. – 2013-03-06 14:22:41

+0

此代碼不起作用 – hitesh 2015-01-28 10:45:07

0

可以使用MultiAutoCompleteTextView實現這一目標。只需實施你自己的Tokenizer類,它的工作原理。對於提及,我寫了一門課,你可以使用它。

package howdysam.com.howdysuggesttext; 

import android.text.SpannableString; 
import android.text.Spanned; 
import android.text.TextUtils; 
import android.widget.MultiAutoCompleteTextView; 


public class AtTokenizer implements MultiAutoCompleteTextView.Tokenizer { 

    @Override 
    public int findTokenStart(CharSequence text, int cursor) { 
     int i = cursor; 

     while (i > 0 && text.charAt(i - 1) != '@') { 
      i--; 
     } 
     while (i < cursor && text.charAt(i) == '@') { 
      i++; 
     } 

     return i; 
    } 

    @Override 
    public int findTokenEnd(CharSequence text, int cursor) { 
     int i = cursor; 
     int len = text.length(); 

     while (i < len) { 
      if (text.charAt(i) == '@') { 
       return i; 
      } else { 
       i++; 
      } 
     } 

     return len; 
    } 

    @Override 
    public CharSequence terminateToken(CharSequence text) { 
     int i = text.length(); 

     while (i > 0 && text.charAt(i - 1) == '@') { 
      i--; 
     } 

     if (i > 0 && text.charAt(i - 1) == '@') { 
      return text; 
     } else { 
      if (text instanceof Spanned) { 
       SpannableString sp = new SpannableString(text + "@"); 
       TextUtils.copySpansFrom((Spanned) text, 0, text.length(), 
         Object.class, sp, 0); 
       return sp; 
      } else { 
       return text; 
      } 
     } 
    } 
} 

然後在視圖部分(活動或片段),而不是做

edit.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 

做以下

edit.setTokenizer(new AtTokenizer()); 

它的工作原理。