Android中实现RecyclerView,并对item及其多个子控件的点击事件监听

这篇具有很好参考价值的文章主要介绍了Android中实现RecyclerView,并对item及其多个子控件的点击事件监听。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

背景

实现RecyclerView

第一步、 新建item的xml

第二步、在activity的布局中引入 RecyclerView

第三步、新建一个adapter 

 第四步、在activity中初始化绑定adapter即可

实现item及其多个子组件点击事件监听

第一步、 适配器中创建监听对象

第二步、适配器中绑定监听item和子组件

第三点、在activity中实现方法


背景

如下图所示,在对RecyclerView中item及其多个子组件都需要不同的点击事件监听处理,需要使用到adapter的OnItemClickListener和OnItemChildClickListener两个对象。

recyclerview 不同item的 点击事件,android,android

实现RecyclerView

第一步、 新建item的xml

新建一个xml文件(black_item.xml)作为单个item的样式,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp">
    
    <androidx.appcompat.widget.LinearLayoutCompat
        android:id="@+id/lc_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center_vertical"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="5dp"
        tools:ignore="MissingConstraints">

        <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/black_item_ip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="18sp"
                android:textStyle="bold"
                android:text="180.123.121.118"/>

            <ImageView
                android:id="@+id/iv_copy_ip"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="10dp"
                android:src="@drawable/baseline_content_copy_24"/>

            <TextView
                android:id="@+id/black_item_time"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="right"
                android:textSize="12sp"
                android:textColor="@color/notice_item_time"
                android:text="2023-11-06 12:10:11"/>


        </androidx.appcompat.widget.LinearLayoutCompat>

        <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <androidx.appcompat.widget.LinearLayoutCompat
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/black_item_address"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:textSize="15sp"
                    android:text="中国-广东省-深圳市"/>

                <TextView
                    android:id="@+id/black_item_note"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:layout_marginBottom="2dp"
                    android:textSize="12sp"
                    android:textColor="@color/notice_item_time"
                    android:text="备注:"/>

            </androidx.appcompat.widget.LinearLayoutCompat>

            <Button
                android:id="@+id/btn_black_del"
                android:layout_width="wrap_content"
                android:layout_height="30sp"
                android:background="@drawable/btn_black_del"
                android:layout_gravity="center_vertical"
                android:textColor="@color/white"
                android:text="删除"/>

        </androidx.appcompat.widget.LinearLayoutCompat>

    </androidx.appcompat.widget.LinearLayoutCompat>


</androidx.appcompat.widget.LinearLayoutCompat>

 样式效果如下图:

recyclerview 不同item的 点击事件,android,android

第二步、在activity的布局中引入 RecyclerView

<androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/rv_black"
                    tools:listitem="@layout/black_item"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />

第三步、新建一个adapter 

用于相应数据和功能配置,代码如下:文章来源地址https://www.toymoban.com/news/detail-827936.html

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private List<BlackItem> myBlackList = new ArrayList<>();

    public void setListData (List<BlackItem> list) {
        this.myBlackList = list;
        notifyDataSetChanged(); // 刷新
    }

    @NonNull
    @Override
    public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        // 加载布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.black_item, parent, false);
        MyHolder myHolder = new MyHolder(view);

        return myHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull MyHolder holder, @SuppressLint("RecyclerView") int position) {
        // 绑定数据
        BlackItem BlackItem = myBlackList.get(position);

        // 修改item样式
        holder.black_address.setText(BlackItem.getIp_address());
        holder.black_note.setText("备注:" + BlackItem.getNote());
        holder.black_time.setText(BlackItem.getCreated_time());
        holder.black_ip.setText(BlackItem.getIp());
    }

    @Override
    public int getItemCount() {
        return myBlackList.size();
    }

    static class MyHolder extends RecyclerView.ViewHolder {
        
        TextView black_address;
        TextView black_note;
        TextView black_time;
        TextView black_ip;
        ImageView iv_copy_ip;
        Button btn_black_del;

        public MyHolder(@NonNull View itemView) {
            super(itemView);

            black_time = itemView.findViewById(R.id.black_item_time);
            black_ip = itemView.findViewById(R.id.black_item_ip);
            black_address = itemView.findViewById(R.id.black_item_address);
            black_note = itemView.findViewById(R.id.black_item_note);
            iv_copy_ip = itemView.findViewById(R.id.iv_copy_ip);
            btn_black_del = itemView.findViewById(R.id.btn_black_del);
        }
    }
}

 第四步、在activity中初始化绑定adapter即可

public class IpBlackListActivity extends AppCompatActivity {

    private RecyclerView blackRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ip_black_list);

        initView();
  
    }

    private void initView () {

        blackRecyclerView = findViewById(R.id.rv_black);

        // 绑定适配器
        blackRVAdapter = new BlackRVAdapter();
        blackRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        blackRecyclerView.setAdapter(blackRVAdapter);
        blackRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); // 添加下划线
       
    }
}

实现item及其多个子组件点击事件监听

第一步、 适配器中创建监听对象

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private static OnItemChildClickListener onItemChildClickListener;
    private static OnItemClickListener onItemClickListener;

   
    public interface OnItemChildClickListener {
        /**
         * 子组件点击事件
         * @param view
         * @param position
         * @param type 子组件类型,用于判断是哪个子组件
         */
        void onItemChildClick(View view, int position, String type);
    }

    public void setOnItemClickListener(OnItemChildClickListener listenser) {
        onItemChildClickListener = listenser;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listenser) {
        onItemClickListener = listenser;
    }

}

第二步、适配器中绑定监听item和子组件

public class BlackRVAdapter extends RecyclerView.Adapter<BlackRVAdapter.MyHolder> {

    private static OnItemChildClickListener onItemChildClickListener;
    private static OnItemClickListener onItemClickListener;

    static class MyHolder extends RecyclerView.ViewHolder {
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            
            // 绑定子控件
            iv_copy_ip = itemView.findViewById(R.id.iv_copy_ip);
            btn_black_del = itemView.findViewById(R.id.btn_black_del);

            // 子控件1
            btn_black_del.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemChildClickListener != null) {
                        onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_1");
                    }
                }
            });

            // 子控件2
            iv_copy_ip.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemChildClickListener != null) {
                        onItemChildClickListener.onItemChildClick(view, getAdapterPosition(), "chil_2");
                    }
                }
            });

            // item点击监听
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(getAdapterPosition());
                    }
                }
            });
        }
    }

    public interface OnItemChildClickListener {
        /**
         * 子组件点击事件
         * @param view
         * @param position
         * @param type 子组件类型,用于判断是哪个子组件
         */
        void onItemChildClick(View view, int position, String type);
    }

    public void setOnItemClickListener(OnItemChildClickListener listenser) {
        onItemChildClickListener = listenser;
    }

    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listenser) {
        onItemClickListener = listenser;
    }

}

第三点、在activity中实现方法

public class IpBlackListActivity extends AppCompatActivity {

    private RecyclerView blackRecyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ip_black_list);

        initView();
  
    }

    private void initView () {

        blackRecyclerView = findViewById(R.id.rv_black);

        // 绑定适配器
        blackRVAdapter = new BlackRVAdapter();
        blackRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        blackRecyclerView.setAdapter(blackRVAdapter);
        blackRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); // 添加下划线

        // 子组件点击事件
        blackRVAdapter.setOnItemClickListener(new BlackRVAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(View view, int position, String type) {
                if (type.equals("chil_1")) {
                    // 子组件1点击后执行...
                    
                } else if (type.equals("chil_2") {
                    // 子组件2点击后执行...
                    
                }
            }
        }
        
        // item点击事件
        blackRVAdapter.setOnItemClickListener(new BlackRVAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                // item点击后执行...                

            }
        });
       
    }
}

到了这里,关于Android中实现RecyclerView,并对item及其多个子控件的点击事件监听的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】RecyclerView实现列表中的Item之间设置间距的一种方式

    RecyclerView 的 Item 默认没有间距是因为 RecyclerView 是一个高度自定义的控件,它的目标是提供一个高效灵活的列表展示,并且适应各种不同的布局需求。 为了让开发者能够充分自定义列表项的布局和样式,RecyclerView 没有默认设置项来添加 item 之间的间距。这样设计的好处是,

    2024年02月13日
    浏览(53)
  • 解决Android中使用RecyclerView滑动时底部item显示不全的问题

    感觉这个bug是不是因人而异啊,找了很多文章都没能解决我的问题,包括在RecyclerView上在嵌套上一层RelativeLayout,添加属性android:descendantFocusability=”blocksDescendants”,使用ConstraintLayout布局包裹RecyclerView,再设置layout_height=\\\"0dp\\\"和layout_constraintBottom_toBottomOf=\\\"parent\\\"(就是指定约束

    2024年02月16日
    浏览(42)
  • Android RecyclerView实现选中Item变色的最精简高效实现(绝不会出现点击时其它item偶尔也被选中现象)

    效果:  核心代码如下: 代码超精简,试一下您就知道了。跟网上其它的教程不同,绝不会出现点击时其它item偶尔也被同步选中改变颜色导致乱串的现象

    2024年02月11日
    浏览(41)
  • Android Glide in RecyclerView,only load visible item when page return,Kotlin

    base on this article: Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin_zhangphil的博客-CSDN博客 【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用

    2024年02月09日
    浏览(45)
  • Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin

    build.gradle文件: 如果手机图片很多,假设已经将全部图片装入宫格的列表,在快速上下滑动过程中,由于glide会累积每一个图片的加载任务,如果图片比较大,上下滑动时间又很长,那么累积任务会很严重,导致异常发生,实现在RecyclerView切入后台(或不可见)时候,然后再

    2024年02月10日
    浏览(49)
  • 【Android从零单排系列二十五】《Android视图控件——RecyclerView》

    目录 前言 一 RecyclerView基本介绍 二 RecyclerView使用方法 三 RecyclerView常见属性及方法 四 RecyclerView简单案例 五 总结 小伙伴们,在上文中我们介绍了Android视图组件Gallery,本文我们继续盘点,介绍一下视图控件的RecyclerView。 RecyclerView是Android支持库中的一个强大的视图容器,用于

    2024年02月12日
    浏览(49)
  • 【Android】自定义Spinner控件及其使用

    在 res/values/ 文件夹下新建一个 arrays.xml 文件: activity_main.xml 文件: 2.1 dropdown模式 效果: 2.2 dialog模式 效果: 在 res/drawable/ 文件夹下新建两个文件: (1) shape_for_custom_spinner.xml 文件(用来定义下拉框的样式): (2) selector_for_custom_spinner 文件(用来定义Spinner控件本身的样

    2023年04月16日
    浏览(35)
  • 安卓RecyclerView实现系统相册相机添加多个图片

    安卓RecyclerView实现系统相册相机添加多个图片 1.这个是弹出一个弹框选择相册还是相机 2.` 这里是activity的回调方法. // Bitmap roundedCornerBitmap = getRoundedCornerBitmap(bitmap, 400); 3.弹框布局 4.RecyclerView布局 5.RecyclerView布局里面的二个布局 因为要实现的是在RecyclerView里面添加一个添加按

    2024年02月20日
    浏览(39)
  • 初入Mac的设置及其必备软件(Homebrew + item2)

    近期,博主也顺利的从win系统转换到了Mac系统,刚开始转入Mac系统还是有很多不适应,以及对macOS的不熟悉。但是一直听说都是开发者用macOS能够提高开发效率等等的话语。那么接下来可以跟着博主一起熟悉macOS的使用。 经过几天的了解,我对macOS的初步总结就是 macOS其实可以

    2024年02月14日
    浏览(43)
  • Android11.0 生成系统签名.jks文件并对Apk进行签名

    V2签名 对应用手动进行系统签名,需要platform.pk8,platform.x509.pem,signapk.jar这三个文件,应用的AndroidManifest.xml中需要添加 android:sharedUserId=“android.uid.system” ,然后输入以下命令就可得到签名后的apk文件: 如果你的应用 targetSdkVersion=30 ,在7.0以上的设备上安装不成功,会报以

    2024年02月07日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包