RecyclerView Adapter中点击按钮添加评论至ListView遇构造器错误求助
解决ArrayAdapter构造器参数不匹配的错误
问题根源
你遇到的这个编译错误,核心问题出在this的指向不对!在匿名的OnClickListener内部写this,它指向的是这个点击事件的实例,而不是Android组件需要的Context(比如你的Activity或者Fragment)。ArrayAdapter的第一个参数必须是有效的Context对象,所以编译器才会报错说“无法将OnClickListener转换为Context”。
快速修复方案
你只需要把构造器里的this替换成正确的Context就行,有几种靠谱的方式:
- 如果你的代码是在Activity内部的RecyclerView Adapter里,直接用
你的Activity类名.this(比如MainActivity.this)来获取Activity的上下文 - 如果你的Adapter是独立的类,建议在Adapter的构造方法里传入Context并保存为成员变量,这里直接用那个成员变量即可
- 还可以从点击的View对象里拿上下文:
v.getContext()
修改后的代码示例
假设你的Activity叫MainActivity,修改后的代码如下:
holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String commento = holder.tw.getText().toString(); ArrayList<String> arrayList = new ArrayList<String>(); // 替换成正确的Context final ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, arrayList); arrayList.add(commento); holder.lw.setAdapter(adapter); adapter.notifyDataSetChanged(); } });
如果不想依赖Activity类名,用View的上下文更通用:
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(v.getContext(), android.R.layout.simple_list_item_1, arrayList);
额外优化小建议
- 你现在每次点击按钮都新建ArrayList和ArrayAdapter,这有点浪费资源。更好的做法是把ArrayList和Adapter作为成员变量提前初始化,点击时只需要往列表里加数据,然后调用
adapter.notifyDataSetChanged()刷新就行,不用每次都重新创建对象。 - 既然你原本用的是RecyclerView,其实可以考虑直接用RecyclerView来展示评论列表,这样整个页面的组件风格更统一,也能利用RecyclerView的性能优势~
内容的提问来源于stack exchange,提问作者oliver
相关产品推荐
相关产品推荐

