如何在Android中使用AutoCompleteTextView和RecyclerView.Adapter而不是ArrayAdapter?

14
我有一个需要实现自动建议的条件。为此,我一直在尝试使用自定义的RecyclerView.Adapter。但问题是,AutoCompleteTextView似乎是为BaseAdapter及其子类而设计的。 因此,该适配器无法被接受。是否有其他方法可以将RecyclerView适配器与AutoCompleteTextView一起使用?ArrayListAdapter或BaseAdapter是AutCompleteTextView的唯一解决方案吗?

1
嘿,阿米特,你解决了这个问题吗? - UrMi
希望这对你有所帮助。链接1链接2 - Ait Bri
1个回答

11

AutoCompleteTextView 需要一个同时也实现了 Filterable 接口的 ListAdapter。您可以通过使用一个围绕着扩展了 BaseAdapterRecyclerView.Adapter 的包装器类,并委托对底层 RecyclerView.Adapter 的调用来实现这一点。以下是一个示例:

public class RecyclerBaseAdapter<VH extends RecyclerView.ViewHolder> 
    extends BaseAdapter implements Filterable {

    private final RecyclerView.Adapter<VH> mAdapter;

    public RecyclerBaseAdapter(RecyclerView.Adapter<VH> adapter) {
        mAdapter = adapter;
    }

    @Override
    public int getItemViewType(int position) {
        return mAdapter.getItemViewType(position);
    }

    @Override
    public int getCount() {
        return mAdapter.getItemCount();
    }

    @Override
    public Object getItem(int position) {
        // not supported
        return null;
    }

    @Override
    public long getItemId(int position) {
        return mAdapter.getItemId(position);
    }

    @SuppressWarnings("unchecked")
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        VH holder;
        if (convertView == null) {
            holder = mAdapter.createViewHolder(parent, getItemViewType(position));
            convertView = holder.itemView;
            convertView.setTag(holder);
        } else {
            holder = (VH) convertView.getTag();
        }
        mAdapter.bindViewHolder(holder, position);
        return holder.itemView;
    }

    @Override
    public Filter getFilter() {
        // TODO: return a real filter
        return null;
    }
}

现在你可以执行mAutoCompleteTextView.setAdapter(new RecyclerBaseAdapter(mRecyclerViewAdapter))。 我只在Spinner上测试过,但它也应该适用于你的情况。


嗨,@chessdork,我一定会尝试的。谢谢。 - Ait Bri
2
使用这段代码,我只能让构造函数执行,其他方法都没有进入,并且我的自动完成文本视图中也没有显示任何内容。 - CQM
这种方法对我很有效。我还不得不实现getViewTypeCount(),因为我包装的RecyclerView.Adapter使用了多个项目视图类型。 - leorleor
@CQM 和 ssPerman01:您需要根据自己的需求创建一个过滤器并实现它。 - Nirab Pudasaini
我可以分享筛选器代码吗?因为在尝试返回筛选器时出现了错误。 - Farmer

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