300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 如何设置 RecyclerView Item内子控件点击事件

如何设置 RecyclerView Item内子控件点击事件

时间:2022-02-13 01:59:48

相关推荐

如何设置 RecyclerView Item内子控件点击事件

前言

起初学习Android的时候,为了兼容低版本的安卓(不是有兼容包吗?摔!),在学习列表的时候,选择了ListView而跳过了RecyclerView。最近项目需要增加新功能模块,于是动起了在该功能中用RecyclerView替代ListView的念头。

关于RecyclerView的总结,有时间我一定补上(咕咕)...... 这里先记录一下使用中遇到的问题及我的一些心得体会。

RecyclerView点击事件

这里主要介绍的是郭霖《第一行代码 第二版》中使用的方法,及参考网上的一些改进方法。

创建ItemView时添加点击事件

即在RecyclerViewAdapter类中:onCreateViewHolder()中可以取得ItemItem内子控件,那么我们可以在此处设置监听。

@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ate_recyclerview_item, parent, false);final ViewHolder holder = new ViewHolder(view,mOnItemClickListener);holder.ItemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {int position = holder.getAdapterPosition();ATE_RecyclerviewItem_Data ate = mATEList.get(position);Toast.makeText(view.getContext(), "你点击了View"+ ate.getName(), Toast.LENGTH_SHORT).show();}});holder.ateEdit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//...}});return holder;}

这种方法实现起来很简单,但是我们的逻辑需要写在Adapter中,耦合严重

改进:通过接口实现点击事件

RecyclerView 的 Adapter类

private OnItemClickListener mOnItemClickListener;public interface OnItemClickListener {void onButtonClicked(View view, int position,String input_str);}public void setOnItemClickListener(OnItemClickListener clickListener) {this.mOnItemClickListener = clickListener;}//...static class ViewHolder extends RecyclerView.ViewHolder{View ItemView;TextView ateName;EditText ateEdit;Button ateButton;public ViewHolder(View view, final OnItemClickListener onClickListener) {super(view);ItemView = view;ateName = view.findViewById(R.id.ate_name);ateEdit = view.findViewById(R.id.ate_edit);ateButton = view.findViewById(R.id.ate_button);ateButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (onClickListener != null) {int position = getAdapterPosition();//确保position值有效if (position != RecyclerView.NO_POSITION) {onClickListener.onButtonClicked(view, position,,ateEdit.getText().toString());}}}});}}//...@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ate_recyclerview_item, parent, false);final ViewHolder holder = new ViewHolder(view,mOnItemClickListener);return holder;}

这里我们在ViewHolder中设置了子控件Button的点击事件,而点击事件的处理方法是接口OnItemClickListener()onButtonClicked()

这一接口必须在外部实现,于是我们对外暴露了setOnItemClickListener()方法。

接下来需要解决的问题是,ViewHolder是静态内部类,我们如何在ViewHolder中取得OnItemClickListener()呢?

这里使用的方法是在onCreateViewHolder()中 创建ViewHolder时进行传参。

外部使用时,仅需要

adapter.setOnItemClickListener(new ATEAdapter.OnItemClickListener() {@Overridepublic void onButtonClicked(View view, int position, String input_str) {Toast.makeText(getActivity(),position+":"+ input_str,Toast.LENGTH_SHORT).show();}});

效果(这里仅截取了部分)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。