在 android 中使用自定义适配器而不是正确的开始位置时从 MultiAutoCompleteTextView 中获取项目?

Posted

技术标签:

【中文标题】在 android 中使用自定义适配器而不是正确的开始位置时从 MultiAutoCompleteTextView 中获取项目?【英文标题】:Getting items from start in MultiAutoCompleteTextView when using custom adaptor in android instead of correct start place? 【发布时间】:2014-06-11 17:50:46 【问题描述】:

我为 MultiAutoCompleteTextView 创建了一个自定义适配器,它为我提供了列表视图的视图。问题是,当我输入任何字符时,它会给出正确的计数,但起始索引从 0 开始,因此我看到错误的名称。

    String[] personsList = "Rahul", "Mike", "Mantu","Mathew", "Gatr", "Ahamad";
    AutoCompleteNameAdaptor autoCompleteAdaptor = new AutoCompleteNameAdaptor(getApplicationContext(), personsList);
    CustomMultiAutoCompleteTextView personName = (CustomMultiAutoCompleteTextView) findViewById(R.id.allPeopleInvolved);
    personName.setThreshold(1);
    personName.setAdapter(autoCompleteAdaptor);
    personName.setTokenizer(new CustomMultiAutoCompleteTextView.CommaTokenizer());

当列表视图打开时,它总是显示列表项从“Rahul”开始,即使我输入“m”,但计数仍然是 3,因此 3 个项目从项目 0 开始。

这在 android arrayAdaptor 中运行良好:

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, personsList);

我是否应该调试以了解为什么它没有在我的适配器的 getView 函数中传递正确的索引,或者我是否需要设置一些排序算法来对列表进行排序并再次在适配器中更新它,如果是的话在哪里?

自定义适配器代码

public class AutoCompleteNameAdaptor  extends ArrayAdapter<String> 

LayoutInflater inflater;
String[] listItems;

public AutoCompleteNameAdaptor(Context context, String[] objects) 
    super(context, R.layout.people_involved_autocomplete_list, objects);
    this.listItems = objects;
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    GenericItemViewHolder holder;
    if (convertView == null) 
        convertView = inflater.inflate(R.layout.people_involved_autocomplete_list, parent, false);
        holder = new GenericItemViewHolder();
        holder.personNameLabel = (TextView) convertView.findViewById(R.id.personName);
        holder.personNameLabel.setText(this.listItems[position]);
        convertView.setTag(holder);
     else 
        holder = (GenericItemViewHolder)convertView.getTag();
    

    return convertView;


@Override
public String getItem(int position) 
    return this.listItems[position];


public static class GenericItemViewHolder 
    public TextView personNameLabel;
    public ImageView personNameImage;

【问题讨论】:

【参考方案1】:

应用了我自己的自定义过滤器

@Override
public Filter getFilter() 
    if (filter == null)
        filter = new AutoCompleteFilter(listItems);
    return filter;

在函数 performFiltering 中添加了我自己的逻辑。

同样在 getView 函数中 if (convertView == null) 不需要,因为如果我们只检查 null 并显示位置元素是否存在,它将始终显示缓存值。

【讨论】:

以上是关于在 android 中使用自定义适配器而不是正确的开始位置时从 MultiAutoCompleteTextView 中获取项目?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用 SearchableSpinner 和自定义适配器

如何在列表适配器中正确使用 ViewHolder 和自定义视图

为啥当设备在 android 中水平时,ListView 内的嵌套自定义视图会阻止正确聚焦?

片段中ListView的android自定义适配器

Android ListView 和带有 ViewHolder 的自定义适配器

在 ListView 的自定义适配器中从 URL 加载图像(Android Studio)