BottomSheetDialog高度自适应,布局RecyclerView使用问题

复制代码
public class CultureBottomDialogView {
    /**
     * 标题
     */
    private static TextView textTitle;
    /**
     * 关闭按钮
     */
    private static TextView textClose;
    /**
     * 列表
     */
    private static RecyclerView recyclerView;
    private static BottomDialogAdapter dialogAdapter;
    private static List<String> mData = new ArrayList<>();
    public static BottomSheetDialog showReportDialog(Context context) {
        /**
         * Dialog自带白色背景问题,设置style
         */
        int maxHeight = (int) (ScreenUtils.getScreenHeight()*0.7);
        BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(context,R.style.CustomDialog);
        /**
         * 高度比较高的自定义bottomsheetdialog弹框在展示时可能会因为大于16:9 比例的关键线而收缩一些高度如何让弹窗全部展示并且收缩的时候全部收缩
         * 调整peekHeight以避免不必要的收缩:
         */
        bottomSheetDialog.getBehavior().setPeekHeight(maxHeight);

        View commentView = LayoutInflater.from(context).inflate(R.layout.culture_bottom_dialog_view_layout, null);
        ConstraintLayout layout = commentView.findViewById(R.id.culture_bottom_dialog_view_parent_layout);
        layout.setMaxHeight(maxHeight);
        textTitle = commentView.findViewById(R.id.culture_bottom_dialog_view_title);
        textClose = commentView.findViewById(R.id.culture_bottom_dialog_view_close);
        recyclerView = commentView.findViewById(R.id.culture_bottom_dialog_view_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));
        dialogAdapter = new BottomDialogAdapter();
        recyclerView.setAdapter(dialogAdapter);
        /**
         * 动态设置RecyclerView的高度不设置外部布局的高度
         */
        dialogAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                //字体大小15sp,上下18padding ,底部边线0.5
                int itemHeight = SizeUtils.sp2px(15)+SizeUtils.dp2px(36.5f);
                int recyclerHeight = dialogAdapter.getItemCount() * itemHeight;
                ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(ConstraintLayout.LayoutParams.WRAP_CONTENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT);
                layoutParams.topToBottom = R.id.culture_bottom_dialog_view_title;
                if(recyclerHeight>maxHeight){
                    layoutParams.height = maxHeight;
                }else {
                    layoutParams.height = recyclerHeight;
                }
                recyclerView.setLayoutParams(layoutParams);
            }
        });
        dialogAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                bottomSheetDialog.dismiss();
            }
        });
        textClose.setOnClickListener(new NoDoubleClickListener() {
            @Override
            protected void onNoDoubleClick(View v) {
                bottomSheetDialog.dismiss();
            }
        });
        bottomSheetDialog.setContentView(commentView);
        /**
         * 点击外部能否关闭
         */
        bottomSheetDialog.setCancelable(false);
        bottomSheetDialog.setCanceledOnTouchOutside(false);
        return bottomSheetDialog;
    }

    public static void setRecyclerData(){
        if(dialogAdapter!=null){
            for (int i = 0; i < 5; i++) {
                mData.add("济南");
            }
            dialogAdapter.setNewInstance(mData);
        }
    }

    public static void setRecyclerData2(){
        if(dialogAdapter!=null){
            for (int i = 0; i < 5; i++) {
                mData.add("电影");
            }
            dialogAdapter.setNewInstance(mData);
        }
    }

    private static class BottomDialogAdapter extends BaseWidgetChildAdapter<String, BaseViewHolder> {
        public BottomDialogAdapter() {
            super(R.layout.culture_bottom_dialog_view_recycler_item_layout);
        }

        @Override
        protected void convert(@NonNull BaseViewHolder holder, String s) {
            TextView textTitle = holder.getView(R.id.culture_bottom_dialog_view_recycler_item_title);
            textTitle.setText(s);
        }
    }

}

使用过程中一直有个问题困扰着,设置了高度后往上滑动的时候总有一块伸展的布局

一开始总以为是RecyclerView的问题,后来滑动外层也会伸展确认是外层问题

BottomSheetDialog因为比例问题会有一部分伸展

bottomSheetDialog.getBehavior().setPeekHeight(maxHeight);

直接设置伸展高度是RecyclerView的最大高度

再一个问题就是RecyclerView的条目变化的时候

复制代码
ConstraintLayout的限制不生效了也就是
复制代码
layout_constraintTop_toBottomOf不生效了

因为是动态设置RecyclerView的高度,忘了动态添加

layoutParams.topToBottom = R.id.culture_bottom_dialog_view_title;

记住添加

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui