1. 程式人生 > >可自定義擴充套件底部列表對話方塊ListBottomSheetDialogFragment

可自定義擴充套件底部列表對話方塊ListBottomSheetDialogFragment

因為需要,為了方便,構建了一個可以自定義擴充套件的底部列表對話方塊,可以應付大部分場景。
效果圖如下:
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.1'
	}

三.功能使用

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(this, 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(this, 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();
                            }
                        })
                        .build();
                ListBSDialogFragment headerFragment = ListBSDialogFragment.newInstance(
                        this, headerOption, new CustomHeaderView(this));
                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監聽器

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.BaseBSDialogFragment

所有BottomSheet對話方塊的父類,提供可繼承的showToast和資源初始化和銷燬方法,及回撥介面

private Toast mToast;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return initView(inflater, container);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mToast = null;
        release();
    }

    /**
     * 初始化控制元件資源
     *
     * @param inflater  佈局填充器
     * @param container 父佈局容器
     * @return 返回填充佈局
     */
    protected abstract View initView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container);

    /**
     * 釋放資源
     */
    protected abstract void release();

    /**
     * 顯示提示資訊
     *
     * @param hint 提示文字
     */
    protected void showToast(Context context, String hint) {
        if (mToast == null) {
            mToast = Toast.makeText(context, hint, Toast.LENGTH_SHORT);
        } else {
            mToast.setText(hint);
        }
        mToast.show();
    }

    /**
     * 根據資源id顯示提示資訊
     *
     * @param stringResourceId 提示文字資源id
     */
    protected void showToast(Context context, int stringResourceId) {
        showToast(context,getString(stringResourceId));
    }

    public interface Callback {

        /**
         * 由Activity實現的回撥方法
         *
         * @param fragment 回撥的fragment
         * @param bundle   傳遞的引數值
         */
        void onCall(BottomSheetDialogFragment fragment, Bundle bundle);

    }

7.ListBSDialogFragment

繼承自BaseBSDialogFragment,真正實現底部列表對話方塊功能
通過以下兩個靜態方法,獲取對話方塊例項並使用

/**
     * 建立列表底部對話方塊例項,選用預設頭部view
     *
     * @param context 上下文
     * @param option  列表選項
     * @return 返回建立的對話方塊例項
     */
    public static ListBSDialogFragment newInstance(Context context, BSDialogFgListOption option) {
        return newInstance(context, option, null);
    }

    /**
     * 建立列表底部對話方塊例項
     *
     * @param context        上下文
     * @param option         列表選項
     * @param headerViewable 自定義的頭部view
     * @return 返回建立的對話方塊例項
     */
    public static ListBSDialogFragment newInstance(Context context,
                                                   BSDialogFgListOption option,
                                                   HeaderViewable headerViewable) {
        ListBSDialogFragment fragment = new ListBSDialogFragment();
        fragment.mOption = option;
        if (headerViewable == null) {
            headerViewable = DefaultHeaderView.getInstance(context);
        }
        fragment.vHeaderViewable = headerViewable;
        return fragment;
    }

總結

上述功能基本實現了各種底部列表對話方塊所需要的功能,更具體的程式碼資訊請到GitHub或碼雲上查閱,GitHub地址https://github.com/MingYueChunQiu/ListBSDialogFragmentHelper.git,歡迎大家審閱,如果有什麼更好的建議歡迎反饋,如果覺得還可以幫忙GitHub點個star,謝謝!