由於須要,爲了方便,構建了一個能夠自定義擴展的底部列表對話框,能夠應付大部分場景。 效果圖以下: 1.默認實現: 2.自定義列表實現 3.自定義頭部和列表實現 android
1.默承認實現通用列表對話框,上方HeaderView包括取消、標題、確認三個文本按鈕,下方爲RecyclerView,實現各類佈局顯示。 2.頭部HeaderView支持自定義,經過實現HeaderViewable接口,進行可擴展。 3.下方RecyclerView支持自定義LayoutManager和適配器,實現本身想要的效果。 4.支持取消、標題、確認view的點擊事件,傳入繼承BRVAH的BaseQuickAdapter,能夠直接獲取庫實現的點擊和長按事件回調,不然須要本身設置點擊和長按事件監聽。git
1.在項目的build.gradle中添加github
allprojects { repositories { ... maven { url 'https://www.jitpack.io' } } }
2.在module的build.gradle中添加maven
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中進行查看ide
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; }
庫默認使用的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;
底部列表對話框設置的配置信息類,採用鏈式調用,可自行配置列表佈局及顯示效果。 相關屬性以下:gradle
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
底部列表對話框頭部view的取消、標題、確認view的點擊事件監聽器ui
/** * 當點擊取消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);
列表item的點擊監聽器,若是是繼承自BaseQuickAdapter的適配器,默認會回調此監聽器,若是不是,須要用戶本身實現點擊事件監聽this
/** * 列表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);
庫默認實現的適配器,繼承自BRVAH的BaseQuickAdapter,實現默認佈局的點擊和長按事件監聽url
真正實現底部列表對話框功能,經過如下兩個靜態方法,獲取對話框實例並使用
/** * 建立列表底部對話框實例,選用默認頭部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,謝謝!