因爲需要,爲了方便,構建了一個可以自定義擴展的底部列表對話框,可以應付大部分場景。
效果圖如下:
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,謝謝!