RecyclerView 中的侧滑事件响应 和 子控件事件响应 冲突 (事件分发机制初识)

博客讲述了在RecyclerView中遇到的侧滑事件与子控件点击事件冲突的问题,根源在于事件分发机制。解决办法是将事件处理移到Activity中,通过在Adapter中定义接口回调到Activity实现,从而避免事件被拦截。此外,还提到可以创建一个抽象类来集中处理各种点击和触摸事件。

1、问题描述

问题出在事件的分发机制上,
我的子项布局响应事件是从《第一行代码》中学的,它把响应事件定义在适配器中。

    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item, viewGroup, false);
        final ViewHolder viewHolder = new ViewHolder(view);

        viewHolder.textView.setOnClickListener(v -> logd);
        viewHolder.imageView.setOnClickListener(v -> logd);

        return viewHolder;
    }

后来我在后续实践中添加侧滑事件,侧滑事件的点击是由RecyclerView来响应的
而如果在子项布局中进行了对click事件的处理,click事件就被拦截了

2、解决办法:

将响应事件放在activity中执行,adapter中只做监听
参考资料:https://blog.youkuaiyun.com/lmj623565791/article/details/45059587
思路:
1、在adapter中定义方法方法接口,click发生之后,调用这个方法。而这个抽象方法的实现在activity中实现
2、因为有很多点击、触摸事件,所以定义一个抽象类,在抽象类中放所有需要的抽象方法。click发生之后,调用抽象类的抽象方法,这个抽象类在activity中实现

3、不足之处,我的浅尝辄止:

1、这里的侧滑菜单的响应究竟是事件分发机制的哪一层呢?
       //SwipeRecyclerView的设置尝试
        //侧滑菜单
        recyclerView.setSwipeMenuCreator(swipeMenuCreator);
        recyclerView.setOnItemMenuClickListener(mMenuItemClickListener);
2、子项布局的响应事件,虽然是放在了activity中,但又是在分发机制的哪一层呢?虽然具体处理方法放在了activity中实现,然后传入adapter。可是对点击事件的监听依然在adapter中啊?这究竟有什么不同?
        adapter.setOnItemClickLitener(new RecyclerView_Adapter.OnItemClickLitener()
        {
            @Override
            public void onImageClick(RecyclerView_item item) {

            Intent intent = new Intent(RecyclerView_activity.this, ItemImg_activity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            intent.putExtra("img_id", item.getImg_id());
            startActivity(intent);

            }

            @Override
            public void onContextClick(RecyclerView_item item) {
                Intent intent = new Intent(RecyclerView_activity.this, ItemContext_activity.class);
                intent.putExtra("context", item.getContext());
                intent.putExtra("title", item.getTitle());
                intent.putExtra("img_id", item.getImg_id());
                startActivity(intent);
            }
        });
3、《第一行代码》中的绑定事件是在onCreateViewHolder中,这里是放在onBindViewHolder绑定 为什么?有什么区别?
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.recycler_item, viewGroup, false);
        final ViewHolder viewHolder = new ViewHolder(view);

        viewHolder.textView.setOnClickListener(v -> logd);
        viewHolder.imageView.setOnClickListener(v -> logd);

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
        RecyclerView_item item = items.get(i);
        
        viewHolder.imageView.setImageResource(item.getImg_id());
        viewHolder.textView.setText(item.getTitle());

        if (mOnItemClickLitener != null) {
            viewHolder.imageView.setOnClickListener(v->mOnItemClickLitener.onImageClick(item));
            viewHolder.textView.setOnClickListener(v->mOnItemClickLitener.onContextClick(item));
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值