Android View 初始化完成后,如果再调用measure再设置点击事件则点击事件会失效的解决方案

比如LinearLayout 或RecyclerView 我们在初始化完成并加载完数据后再次调用measure计算高度再setLayoutParams 会导致后面设置的点击事件失效。

比如:

        RecyclerView rv_select =dialog.findViewById(R.id.rv_select); 

        //点击事件
        rv_select.setOnItemClickListener(new PopupAdapter.OnItemClickListener() {
    
    
         //....
        });

        // 重新测量一下rv_select的真实高度并限定最大值,注意!measure方法必须放在设置点击事件之后,否则点击事件会失效
        ViewGroup.LayoutParams params = rv_select.getLayoutParams();
        rv_select.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        params.height = Math.min(rv_select.getMeasuredHeight(), Tools.dp2px(mContext,290));
        rv_select.setLayoutParams(params);
解决方法:

RecyclerView初始化完成后再调用measure方法可能会导致item点击事件失效的原因是,measure方法会重新测量并布局RecyclerView的子项视图,这可能会破坏已设置的点击监听器。

要解决这个问题,可以尝试以下两种解决方案之一:

  1. 在调用measure方法之前先设置点击监听器: 将设置点击监听器的代码放在RecyclerView初始化完成之后、调用measure方法之前执行。这样,在调用measure方法后,点击监听器仍然有效。

示例代码:

   // RecyclerView初始化
    RecyclerView recyclerView = findViewById(R.id.recyclerview);
    // 设置点击监听器
    recyclerView.setOnItemClickListener(new OnItemClickListener() {
    
    
        @Override
        public void onItemClick(View view, int position) {
    
    
            // 处理点击事件
        }
    });

    // 调用measure方法
    recyclerView.measure(widthMeasureSpec, heightMeasureSpec);

2.避免在初始化完成后再次调用measure方法: 如果没有必要再次调用measure方法,请确保只在初始化阶段调用一次measure方法。如果需要进行布局更新,可以考虑使用其他方法,如requestLayout()或invalidate()。

猜你喜欢

转载自blog.csdn.net/wh445306/article/details/132024354