文档章节

可自定义扩展底部列表对话框ListBottomSheetDialogFragment

 明月春秋
发布于 11/17 18:09
字数 1757
阅读 11
收藏 0

因为需要,为了方便,构建了一个可以自定义扩展的底部列表对话框,可以应付大部分场景。 效果图如下: 1.默认实现: 在这里插入图片描述 2.自定义列表实现 在这里插入图片描述 3.自定义头部和列表实现 在这里插入图片描述

一.可实现功能

1.默认可实现通用列表对话框,上方HeaderView包括取消、标题、确认三个文本按钮,下方为RecyclerView,实现各种布局显示。 2.头部HeaderView支持自定义,通过实现HeaderViewable接口,进行可扩展。 3.下方RecyclerView支持自定义LayoutManager和适配器,实现自己想要的效果。 4.支持取消、标题、确认view的点击事件,传入继承BRVAH的BaseQuickAdapter,可以直接获取库实现的点击和长按事件回调,否则需要自己设置点击和长按事件监听。

二.添加依赖

1.在项目的build.gradle中添加

allprojects {
		repositories {
			...
			maven { url 'https://www.jitpack.io' }
		}
	}

2.在module的build.gradle中添加

dependencies {
	//必须,继承BottomSheetDialogFragment
	implementation 'com.android.support:design:28.0.0'
	//必须,库默认使用BRVAH的适配器,可以选择传入自定义的adapter
   	implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.40'
   	
	implementation 'com.github.MingYueChunQiu:ListBSDialogFragmentHelper:0.1.3'
	}

三.功能使用

1.创建BSDialogFgListOption,存储底部列表对话框的相关配置信息 2.如果需要自定义头部view,创建实现HeaderViewable接口的实例 3.调用ListBSDialogFragment.newInstance,获取底部列表对话框实例并显示。 4.简单demo示例部分片段,详细信息可在底部GitHub中进行查看

switch (view.getId()) {
            case R.id.btn_default:
                BSDialogFgListOption listOption = new BSDialogFgListOption.Builder()
                        .setList(getList())
                        .setOnListBSDfgClickTextListener(new OnListBSDfgClickTextListener() {
                            @Override
                            public void onClickCancel(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "取消" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickTitle(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "标题", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "标题" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickConfirm(@NonNull ListBSDialogFragment fragment, @NonNull BSDialogFgListItemBean itemBean) {
                                Toast.makeText(MainActivity.this, "确认" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onClickConfirmWithoutSelecting(@NonNull ListBSDialogFragment fragment) {
                                Toast.makeText(MainActivity.this, "未选择确认", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .setOnListBSDfgClickItemListener(new OnListBSDfgClickItemListener() {
                            @Override
                            public void onClickListItem(BaseQuickAdapter adapter, View view, int position, BSDialogFgListItemBean itemBean) {
                                Toast.makeText(MainActivity.this, "点击" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public boolean onLongClickListItem(BaseQuickAdapter adapter, View view, int position, BSDialogFgListItemBean itemBean) {
                                Toast.makeText(MainActivity.this, "长按" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                return false;
                            }
                        })
                        .build();
                ListBSDialogFragment listFragment = ListBSDialogFragment.newInstance(listOption);
                listFragment.show(getSupportFragmentManager(), ListBSDialogFragment.class.getSimpleName());
                break;
            case R.id.btn_custom:
                BSDialogFgListOption customOption = new BSDialogFgListOption.Builder()
                        .setCancelColor(Color.BLUE)
                        .setConfirmColor(Color.CYAN)
                        .setTitleColor(Color.GREEN)
                        .setCancelVisible(false)
                        .setLayoutManager(new GridLayoutManager(this, 2))
                        .setAdapter(new CustomAdapter(getList()))
                        .setOnListBSDfgClickTextListener(new OnListBSDfgClickTextListener() {
                            @Override
                            public void onClickCancel(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "自定义取消", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "自定义取消" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickTitle(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "自定义标题", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "自定义标题" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickConfirm(@NonNull ListBSDialogFragment fragment, @NonNull BSDialogFgListItemBean itemBean) {
                                Toast.makeText(MainActivity.this, "自定义确认", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onClickConfirmWithoutSelecting(@NonNull ListBSDialogFragment fragment) {
                                Toast.makeText(MainActivity.this, "自定义未选择确认", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .build();
                ListBSDialogFragment customFragment = ListBSDialogFragment.newInstance(customOption);
                customFragment.show(getSupportFragmentManager(), ListBSDialogFragment.class.getSimpleName());
                break;
            case R.id.btn_custom_header:
                BSDialogFgListOption headerOption = new BSDialogFgListOption.Builder()
                        .setConfirmText("自定义确认")
                        .setCancelColor(Color.BLUE)
                        .setConfirmColor(Color.CYAN)
                        .setTitleColor(Color.GREEN)
                        .setLayoutManager(new GridLayoutManager(this, 2))
                        .setAdapter(new CustomAdapter(getList()))
                        .setOnListBSDfgClickTextListener(new OnListBSDfgClickTextListener() {
                            @Override
                            public void onClickCancel(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "自定义取消", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "自定义取消" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickTitle(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean) {
                                if (itemBean == null) {
                                    Toast.makeText(MainActivity.this, "自定义标题", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(MainActivity.this, "自定义标题" + itemBean.getText(), Toast.LENGTH_SHORT).show();
                                }
                            }

                            @Override
                            public void onClickConfirm(@NonNull ListBSDialogFragment fragment, @NonNull BSDialogFgListItemBean itemBean) {
                                Toast.makeText(MainActivity.this, "自定义确认", Toast.LENGTH_SHORT).show();
                            }

                            @Override
                            public void onClickConfirmWithoutSelecting(@NonNull ListBSDialogFragment fragment) {
                                Toast.makeText(MainActivity.this, "自定义未选择确认", Toast.LENGTH_SHORT).show();
                            }
                        })
						.setHeaderViewable(new CustomHeaderView(this))
                        .build();
                ListBSDialogFragment headerFragment = ListBSDialogFragment.newInstance(headerOption);
                headerFragment.show(getSupportFragmentManager(), ListBSDialogFragment.class.getSimpleName());
                break;
            default:
                break;
        }

四.相关类介绍

1.BSDialogFgListItemBean

库默认使用的BRVAH的adapter,列表实现的每项item数据类型都为BSDialogFgListItemBean,里面包含text(显示文本)和extra(用于用户传递的一些额外数据)

List<BSDialogFgListItemBean> list = new ArrayList<>(6);
        for (int i = 0; i < 6; i++) {
            BSDialogFgListItemBean bean = new BSDialogFgListItemBean();
            bean.setText("第" + i + "项");
            list.add(bean);
        }
        return list;

2.BSDialogFgListOption、

底部列表对话框设置的配置信息类,采用链式调用,可自行配置列表布局及显示效果。 相关属性如下:

private String titleText;//标题文本
    private String cancelText;//取消文本
    private String confirmText;//确认文本
    private int titleColor;//标题文本颜色
    private int cancelColor;//取消文本颜色
    private int confirmColor;//确认文本颜色
    private boolean isCancelVisible = true;//取消文本是否可见
    private boolean isTitleVisible = true;//标题是否可见
    private boolean isConfirmVisible = true;//确认文本是否可见
    private List<BSDialogFgListItemBean> list;//列表数据
    private RecyclerView.LayoutManager layoutManager;//列表布局管理器
    private RecyclerView.Adapter adapter;//列表适配器
    private OnListBSDfgClickTextListener textListener;//列表对话框文本监听器
    private OnListBSDfgClickItemListener itemListener;//列表对话框item监听器
	private HeaderViewable headerViewable;//头部自定义view

3.OnListBSDfgClickHeaderListener

底部列表对话框头部view的取消、标题、确认view的点击事件监听器

 /**
     * 当点击取消view时回调
     *
     * @param fragment 对话框
     * @param itemBean 选中的列表item数据
     */
    void onClickCancel(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean);

    /**
     * 当点击标题view时回调
     *
     * @param fragment 对话框
     * @param itemBean 选中的列表item数据
     */
    void onClickTitle(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean);

    /**
     * 当点击确认view时回调
     *
     * @param fragment 对话框
     * @param itemBean 选中的列表item数据
     */
    void onClickConfirm(@NonNull ListBSDialogFragment fragment, BSDialogFgListItemBean itemBean);

    /**
     * 当没有选择item点击确认view时回调
     *
     * @param fragment 对话框
     */
    void onClickConfirmWithoutSelecting(@NonNull ListBSDialogFragment fragment);

4.OnListBSDfgClickItemListener

列表item的点击监听器,如果是继承自BaseQuickAdapter的适配器,默认会回调此监听器,如果不是,需要用户自己实现点击事件监听

/**
     * 列表item的点击事件(除非自己传入adapter并设置,否则需与BaseRecyclerViewAdapterHelper第三方库配合使用)
     *
     * @param adapter  适配器
     * @param view     点击的view
     * @param position item索引位置
     * @param itemBean 选中的列表item数据
     */
    void onClickListItem(BaseQuickAdapter adapter, View view, int position, BSDialogFgListItemBean itemBean);

    /**
     * 列表item的长按点击事件(除非自己传入adapter并设置,否则需与BaseRecyclerViewAdapterHelper第三方库配合使用)
     *
     * @param adapter  适配器
     * @param view     点击的view
     * @param position item索引位置
     * @param itemBean 选中的列表item数据
     * @return 成功点击长按事件返回true,否则返回false
     */
    boolean onLongClickListItem(BaseQuickAdapter adapter, View view, int position, BSDialogFgListItemBean itemBean);

5.BSDialogFragmentListAdapter

库默认实现的适配器,继承自BRVAH的BaseQuickAdapter,实现默认布局的点击和长按事件监听

6.ListBSDialogFragment

真正实现底部列表对话框功能,通过以下两个静态方法,获取对话框实例并使用

/**
     * 创建列表底部对话框实例,选用默认头部view
     *
     * @return 返回创建的对话框实例
     */
    public static ListBSDialogFragment newInstance() {
        return newInstance(null);
    }

    /**
     * 创建列表底部对话框实例
     *
     * @param option 列表选项
     * @return 返回创建的对话框实例
     */
    public static ListBSDialogFragment newInstance(BSDialogFgListOption option) {
        ListBSDialogFragment fragment = new ListBSDialogFragment();
        fragment.mOption = option;
        return fragment;
    }

总结

上述功能基本实现了各种底部列表对话框所需要的功能,更具体的代码信息请到GitHub或码云上查阅,GitHub地址https://github.com/MingYueChunQiu/ListBSDialogFragmentHelper.git, 欢迎大家审阅,如果有什么更好的建议欢迎反馈,如果觉得还可以帮忙GitHub点个star,谢谢!

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 12
码字总数 11454
作品 0
南京
私信 提问
jQuery弹出对话框--jmodal

使用jQuery插件jmodal可以模拟弹出对话框功能,用户可自定义对话框的标题,内容,确定按钮以及样式等,弹出框内容可以为文本或HTML。 jmodal插件弹出对话框参数如下: data(Object): 传给对话...

匿名
2010/01/22
10.1K
0
Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)

最新内容建议直接访问原文:Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类) 介绍总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉及底部...

Trinea
2013/07/28
861
1
总结的一些android公共库

最新最准确内容建议直接访问原文:Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类) 介绍总结的一些android公共库,包含缓存(图片缓存、预取缓存)、公共View(下拉...

Trinea
2012/07/16
0
1
滚动到底部加载更多及下拉刷新listview的使用

最新内容建议直接访问原文:滚动到底部加载更多及下拉刷新listview的使用 本文主要介绍可同时实现下拉刷新及滑动到底部加载更多的ListView的使用。 该ListView优点包括:a. 可自定义下拉响应...

Trinea
2013/06/24
6.7K
3
H5魔法页面功能(急)

【功能说明】 1、可自定义电子商务商城首页,会场页页面,广告页面,主题页面; 2、可在自定义页面编辑广告轮播图,快捷方式入口,商品列表,商品分类,头部导航栏,底部导航栏等组件的内容和...

timoncici
2016/05/11
3
0

没有更多内容

加载失败,请刷新页面

加载更多

jquery通过id显示隐藏

var $div3 = $('#div3'); 显示 $div3.show(); 隐藏 $div3.hide();

yan_liu
今天
3
0
《乱世佳人》读书笔记及相关感悟3900字

《乱世佳人》读书笔记及相关感悟3900字: 之前一直听「荔枝」,后来不知怎的转向了「喜马拉雅」,一听就是三年。上班的时候听房产,买房了以后听装修,兴之所至时听旅行,分手后听亲密关系,...

原创小博客
今天
3
0
大数据教程(9.6)map端join实现

上一篇文章讲了mapreduce配合实现join,本节博主将讲述在map端的join实现; 一、需求 实现两个“表”的join操作,其中一个表数据量小,一个表很大,这种场景在实际中非常常见,比如“订单日志...

em_aaron
今天
3
0
cookie与session详解

session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠.这时...

士兵7
今天
3
0
十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部