可自定義擴充套件底部列表對話方塊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,謝謝!