2015-03-11 2 views
0

У меня есть MultiAutoCompleteTextView. Он работает нормально. Но я хочу показать раскрывающийся список предложений только тогда, когда пользовательский тип @ на нем (например, тегирование пользователя в приложении facebook). Я понятия не имею, как это сделать. Вот мой код:Как показать выпадающий список только при вставке символа @ на MultiAutoCompleteTextView в android

mChatbox = (MultiAutoCompleteTextView) findViewById(R.id.chatbox); 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line, userList); 
mChatBox.setAdapter(adapter); 
mChatBox.setTokenizer(new SpaceTokenizer()); 

public class SpaceTokenizer implements MultiAutoCompleteTextView.Tokenizer { 

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; 
} 

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; 
} 

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 + " "; 
     } 
    } 
} 

ответ

0

У меня есть решение самостоятельно. Я создаю пользовательский вид, который расширяет MultiAutoCompleteTextView и переопределяет performFiltering. Проверьте, является ли первый символ «@», а затем фильтрует следующие символы после него. В противном случае замените символы «*», чтобы избежать фильтрации. Вот мой код.

@Override 
protected void performFiltering(CharSequence text, int start, int end, int keyCode) { 
    if (text.charAt(start) == '@') { 
     start = start + 1; 
    } else { 
     text = text.subSequence(0, start); 
     for (int i = start; i < end; i++) { 
       text = text + "*"; 
     } 
    } 
    super.performFiltering(text, start, end, keyCode); 
} 
1

Создание представления пользовательского текста простирающегося MultiAutoCompleteTextView -> переопределение enoughToFilter() -> установить порог в 0 (жирных переменную ниже данном коде):

public boolean enoughToFilter() { 
Editable text = getText(); 
int end = getSelectionEnd(); 
if (end < 0 || mTokenizer == null) { 
    return false; 
} 
int start = mTokenizer.findTokenStart(text, end); 
if (end - start >= mThreshold && start != -1) { 
    return true; 
} else { 
    return false; 
} 

}

Используя этот код, вы увидите автоматически предложенный список при нажатии @

1

Если вы хотите, чтобы ваша строка начиналась с символа '@', укажите (тег) кого-то или '#' f или хэштег, а затем сделать запрос или отфильтровать с ним, вы могли бы следовать этому коду сильфонным:

@Override 
    public void onTextChanged(CharSequence s, int start, int before, final int count) { 
     if (s.length() > 0) { 
      // Todo: query mentions 
      Matcher mentionMatcher = Pattern.compile("@([A-Za-z0-9_-]+)").matcher(s.toString()); 
      // while matching 
      while (mentionMatcher.find()) { 
       yourSearchText = s.toString().substring(mentionMatcher.start() + 1, mentionMatcher.end()); 
       // do query with yourSearchText below 
      } 
     } 
    } 

Он ссылается по ссылке Multiautocompletetextview, Show autocomplete drop down only when user presses a key after '@' key (like mention in FB app) пожалуйста, прокрутите вниз, чтобы найти @Phuong Sala ответа.

+1

tks @Ajeets, я редактировал –