@Mention使用Multiautocompletetextview

3

我想做什么

我想在聊天活动中提及个人和群组。当用户输入@时,我想要弹出一个包含用户和频道数量的列表,以便他可以提及个人和频道。

我已经做了什么

我从这个问题Android: Autocomplete TextView Similar To The Facebook App得到了帮助,在这里我已经包含了我的代码。

1. 一个包含用户的ArrayList。

   ArrayList<People> users = new ArrayList<User>();
        for (People user : SocketSingleton.userMap.values()) {
            if (user.getId() != loggedUserId) {
                users.add(user);
            }
        }

2.拥有组列表的ArrayList

ArrayList<Group> groups = new ArrayList<Group>();
        for (Group channel : SocketSingleton.listgroups.values()) {
            groups.add(channel);
        }

3.视图适配器

final UserAdapter Adapter = new UserAdapter(getActivity(), R.layout.all_user_list_item, users);

final GroupAdapter Adapter1 = new GroupAdapter(getActivity(), R.layout.all_groups_list_item, Groups);

4.MultiAutocompletetextview

textinput = (MultiAutoCompleteTextView) view.findViewById(R.id.message_input);
        textinput.setAdapter(Adapter);
        textinput.setThreshold(0);

        textinput.setTokenizer(new MultiAutoCompleteTextView.Tokenizer() {

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

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

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

                //Check if token really started with @, else we don't have a valid token
                if (i < 1 || text.charAt(i - 1) != '@') {
                    return cursor;
                }

                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;
            }
        });
        textinput.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Layout layout = textinput.getLayout();
                int pos = textinput.getSelectionStart();
                int line = layout.getLineForOffset(pos);
                int baseline = layout.getLineBaseline(line);

                int bottom = textinput.getHeight();

                textinput.setDropDownVerticalOffset(baseline - bottom);

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        textinput.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int id, KeyEvent event) {
                if (id == R.id.send || id == EditorInfo.IME_NULL) {
                    messageSend();
                    return true;
                }
                return false;
            }
        });

我遇到的问题

使用这段代码,我只能提及个人。我只能为自动完成文本视图设置adapter1或adapter2。因此,它只显示用户或组。 我希望在单个适配器中显示所有列表,以便用户可以提及人员和组。 我是新手,请帮我找到一种方法。


把这两个适配器合并成一个。 - pskink
请问您能告诉我如何做到这一点吗? - Sabarinathan
不好意思,你没有发布你的“UserAdapter”和“GroupAdapter”代码,那我怎么能做到呢? - pskink
2分钟后我会发布代码。 - Sabarinathan
1个回答

0

MultiAutoCompleteTextView没有内置多种数据类型的支持。但是有几个开源库可以让您实现这一点。 在我正在处理的项目中,我也有同样的需求,这是我们的开源解决方案,请随意查看: https://github.com/Teamwork/android-multiautocomplete

您可以通过以下方式实现:

MultiAutoComplete autoComplete = new MultiAutoComplete.Builder()
    ...
    .addTypeAdapter(typeAdapter1)
    .addTypeAdapter(typeAdapter2)
    .build();

您还可以为每种类型的适配器指定要使用的过滤器类型和处理方式('@'或'#'或其他任何字符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接