RecyclerView按钮OnItemClick参数传递报错,ArrayList参数该传什么?
解决RecyclerView按钮点击事件参数报错问题
你这遇到了两个容易忽略的小问题:SongHolder里的控件绑定错误,以及onItemClick方法的参数匹配问题,我来一步步帮你理顺:
1. 先修正SongHolder里的控件绑定错误
你在SongHolder里把按钮绑定到了R.id.songName,这明显是复制粘贴时的失误,得改成按钮对应的IDR.id.btnAction,不然按钮根本没法正常响应点击:
public class SongHolder extends RecyclerView.ViewHolder { TextView songName, ArtistName; Button btnAction; public SongHolder(View itemView) { super(itemView); songName = (TextView) itemView.findViewById(R.id.songName); ArtistName = (TextView) itemView.findViewById(R.id.ArtistName); // 这里修正为按钮的正确ID btnAction = itemView.findViewById(R.id.btnAction); } }
2. 解决onItemClick参数报错问题
报错的核心原因是你调用onItemClick时传的参数,和你定义的OnItemClickListener接口的方法参数不匹配,分两种情况处理:
情况一:推荐只传当前点击的歌曲数据
通常点击按钮只需要当前项的歌曲信息,所以你的接口应该定义成接收单个Songinfo对象:
// 先定义你的OnItemClickListener接口(可以放在Adapter类内部或者外部) public interface OnItemClickListener { void onItemClick(Button btn, View v, int position, Songinfo currentSong); } // 在Adapter里持有接口实例,并提供设置方法 private OnItemClickListener onItemClickListener; public void setOnItemClickListener(OnItemClickListener listener) { this.onItemClickListener = listener; }
这样你原来的调用代码onItemClickListener.onItemClick(songHolder.btnAction,v,i,c);就完全正确了——c就是当前点击位置的Songinfo对象,调用方拿到后可以直接用这首歌的信息。
情况二:确实需要传递整个歌曲列表
如果业务逻辑必须用到整个列表,那你要把接口定义改成接收ArrayList<Songinfo>,调用时传成员变量_songs而不是c:
// 接口定义调整为接收整个列表 public interface OnItemClickListener { void onItemClick(Button btn, View v, int position, ArrayList<Songinfo> songList); } // 调用时传递整个_songs列表 onItemClickListener.onItemClick(songHolder.btnAction,v,i,_songs);
总结
优先选第一种方案,因为点击事件大多只需要当前项的数据,传整个列表既冗余也不符合常规逻辑。另外一定要先修正按钮的绑定错误,不然参数对了按钮也没法正常工作。
内容的提问来源于stack exchange,提问作者ashir kulshreshtha
相关产品推荐
相关产品推荐

