【问题标题】:Android AutoCompleteTextView display the chosen oneAndroid AutoCompleteTextView 显示选中的一个
【发布时间】:2018-04-21 04:27:27
【问题描述】:

我的 AutoCompleteTextView 有问题,

当我选择其中一项建议时,

它应该显示产品名称(垃圾食品或西餐)。 任何人都请帮我解决这个问题。下面是适配器和过滤器类。

过滤器类 公共类 ProductFilter 扩展过滤器 { AdapterProductAutoComplete 适配器ProductAutoComplete; 列出原始列表; 列出过滤列表;

    public ProductFilter (AdapterProductAutoComplete adapterProductAutoComplete, List<Product>
            originalList){
        super();
        this.adapterProductAutoComplete = adapterProductAutoComplete;
        this.originalList = originalList;
        this.filteredList = new ArrayList<>();
    }

    @Override
    protected Filter.FilterResults performFiltering (CharSequence constraint){
        filteredList.clear();
        final FilterResults results = new FilterResults();

        if(constraint == null || constraint.length() == 0){
            filteredList.addAll(originalList);
        }else{
            final String filterPattern = constraint.toString().toLowerCase().trim();
            for (final Product product : originalList){
                if(product.getProductName().toLowerCase().contains(filterPattern) || Integer
                        .toString(product.getProductId()).toLowerCase().contains(filterPattern)){
                    filteredList.add(product);
                }
            }
        }
        results.values = filteredList;
        results.count = filteredList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapterProductAutoComplete.filteredProducts.clear();
        adapterProductAutoComplete.filteredProducts.addAll((List) results.values);
        adapterProductAutoComplete.notifyDataSetChanged();
    }
}

适配器类

public class AdapterProductAutoComplete extends ArrayAdapter<Product>{
    private final List<Product> products;
    public List<Product> filteredProducts = new ArrayList<>();

    public AdapterProductAutoComplete(Context context, List<Product> products){
        super(context, 0, products);
        this.products = products;
    }

    @Override
    public int getCount(){
        return filteredProducts.size();
    }

    @Override
    public Filter getFilter(){
        return new ProductFilter(this, products);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        Product product = filteredProducts.get(position);
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.list_row_actproduct, parent, false);
        TextView tvCode = (TextView) convertView.findViewById(R.id.actproduct_productcode);
        TextView tvName = (TextView) convertView.findViewById(R.id.actproduct_productname);

        tvCode.setText(Integer.toString(product.getProductId()));
        tvName.setText(product.getProductName());
        return convertView;
    }
}

【问题讨论】:

    标签: android autocompletetextview


    【解决方案1】:

    Product 类中重写 toString() 方法,因为 AutoCompleteTextView 的值来自 toString()。将此代码添加到您的 Product 类:-

    @Override
    public String toString(){
        return getProductName();
    }
    

    Object类中toString()方法的默认实现是这样的:-

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    

    这就是你现在得到的。

    【讨论】:

    • 我解决了一个新问题,它返回建议项位置而不是正确的 ID。假设它返回 5 个建议,我选择第一个,但它会在字段中显示数组列表中的第一个,而不是我选择的那个。你明白吗?
    • 使用getItemAtPosition() 方法。代码:- autoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> adapterView, View view, int i, long l) { selectedProduct=adapterView.getItemAtPosition(i); } });
    • 请参考此链接中的图片link。 getItemAtPosition() 仍然返回错误的数据。
    • @user2412351 请在此页面查看完整示例link。可能对你有帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多