我想为@ like as whatspp特性创建自定义标记器(当打开组和写@然后打开弹出列表,用户可以选择任何选项)。此外,用户还可以删除@的字符串。
我已经找到了类似于搜索功能(示例)的twitter,但是在这个时候,当用户可以写@时,不要显示列表的弹出窗口。用户可以在@之后写一些东西,然后根据输入,弹出窗口将显示搜索结果。
我想展示这样的东西:

发布于 2016-11-10 05:25:27
我为我的问题找到了答案。
我为多自动完成文本视图创建了自己的自定义视图,并在@签名之后添加了打开弹出的performFiltering方法。
public class KcsMultiAutoCompleteTextView extends MultiAutoCompleteTextView {
public KcsMultiAutoCompleteTextView(Context context) {
super(context);
}
public KcsMultiAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public KcsMultiAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@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);
}
}发布于 2016-11-07 08:52:29
请看TokenAutoComplete,我希望它能帮上忙
发布于 2021-01-21 10:10:36
今天我在找这个。我使用了android-多自动完成库。检查与图书馆提供的演示。简而言之,您必须从库中扩展两个类,一个tokenFilter (描述您的模式,在本例中是@字符)和一个ViewBinder (用于自定义建议行,例如将用户图像放置在特定位置等)。所以对我来说,这是TokenFilter:
import androidx.annotation.NonNull;
import ridmik.one.entities.MucOptions;
import ridmik.one.ui.components.autocomplete.filter.HandleTokenFilter;
public class MucUserTokenFilter extends HandleTokenFilter<MucOptions.User> {
public MucUserTokenFilter() {
this('@');
}
public MucUserTokenFilter(char handleChar) {
super(handleChar);
}
@Override
protected boolean matchesConstraint(@NonNull MucOptions.User user, @NonNull CharSequence constraint) {
return user.getComparableName().toLowerCase().contains(constraint.toString().toLowerCase());
}
@Override
public @NonNull CharSequence toTokenString(@NonNull MucOptions.User user) {
return handleChar +user.getComparableName(); // Add handler at the begining! this is the trick!
}
}这是ViewBinder
public class MucUserViewBinder implements AutoCompleteViewBinder<MucOptions.User> {
public static final String TAG = MucUserViewBinder.class.getSimpleName();
@Override
public long getItemId(@NonNull @NotNull MucOptions.User user) {
try{
if(user!=null) {
return user.userId; // ei line e crash kore :/
}
}catch (Exception x) {
Timber.tag(TAG).e("Exception "+x.getMessage());
}
return 0;
}
@Override
public int getItemLayoutId() {
return R.layout.simple_autocomplete_row;
}
@NonNull
@NotNull
@Override
public AutoCompleteViewHolder getViewHolder(@NonNull @NotNull View view) {
return new MucUserViewHolder(view);
}
@Override
public void bindData(@NonNull @NotNull AutoCompleteViewHolder viewHolder, @NonNull @NotNull MucOptions.User user,
@Nullable @org.jetbrains.annotations.Nullable CharSequence constraint) {
MucUserViewHolder itemViewHolder = (MucUserViewHolder) viewHolder;
itemViewHolder.textView.setText(user.getComparableName());
String smallAvatar = user.image + "_sm.png";
Timber.tag(TAG).e("user.image = "+smallAvatar);
Picasso.get().load(smallAvatar)
.placeholder(ContextCompat.getDrawable(itemViewHolder.rootView.getContext(),
R.drawable.ic_avatar_placeholder)).into(itemViewHolder.avatar);
}
static class MucUserViewHolder extends AutoCompleteViewHolder {
public final TextView textView;
public final CircleImageView avatar;
public final View rootView;
protected MucUserViewHolder(@NonNull @NotNull View view) {
super(view);
this.rootView = view;
this.textView = view.findViewById(R.id.textView);
this.avatar = view.findViewById(R.id.avatar);
}
}
}在此之后,您将进入您的活动/片段,并执行以下操作:
private MultiAutoComplete multiAutoComplete = null; // A field in your Activity / Fragment class, initialize it to null.
void initAutoSuggestions() {
ArrayList<MucOptions.User> someList = getUsers(); // <--- suggestions dataset depending on your code.
AutoCompleteTypeAdapter<MucOptions.User> nameTypeAdapter =
AutoCompleteTypeAdapter.Build.from(new MucUserViewBinder(), new MucUserTokenFilter());
nameTypeAdapter.setItems(someList);
this.multiAutoComplete = new MultiAutoComplete.Builder()
.tokenizer(new PrefixTokenizer('@'))
.addTypeAdapter(nameTypeAdapter)
// .delayer(constraint -> { return 10; }) // eta ki bujhi ni
.build();
this.multiAutoComplete.onViewAttached(binding.textinput); // binding.textinput is your multiAutoCompleteView
}然后在onCreate (用于活动)或onViewCreated (用于片段)中调用它。最后,在onDestroy内部:
@Override
public void onDestroy() {
super.onDestroy();
if(multiAutoComplete!=null) {
this.multiAutoComplete.onViewDetached(); // needed for @mention that thing
}
}您还可以在库中查看Demo以查看其他选项。
https://stackoverflow.com/questions/40460997
复制相似问题