比如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的子项视图,这可能会破坏已设置的点击监听器。
要解决这个问题,可以尝试以下两种解决方案之一:
- 在调用measure方法之前先设置点击监听器: 将设置点击监听器的代码放在RecyclerView初始化完成之后、调用measure方法之前执行。这样,在调用measure方法后,点击监听器仍然有效。
示例代码:
// RecyclerView初始化RecyclerView recyclerView = findViewById(R.id.recyclerview);// 设置点击监听器recyclerView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(View view, int position) {// 处理点击事件}});// 调用measure方法recyclerView.measure(widthMeasureSpec, heightMeasureSpec);
2.避免在初始化完成后再次调用measure方法: 如果没有必要再次调用measure方法,请确保只在初始化阶段调用一次measure方法。如果需要进行布局更新,可以考虑使用其他方法,如requestLayout()或invalidate()。