实现一个底部的选择弹框,选用Dialog实现
1.定义弹框Dialog
使用RecycleView进行填充,便于动态加载数据 并使用了BaseQuickAdapter
定义CommonDialogInterface 接口用于点击结果回调
public interface CommonDialogInterface {
// postion 点击位置 value 点击的item值
void onDialogResult(int position,String value);
}
CommonDialog.class
package com.witgo.etcxian.dialog;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.witgo.etcxian.R;
import com.witgo.etcxian.adapter.CommonDialogAdapter;
import java.util.List;
public class CommonDialog extends Dialog implements BaseQuickAdapter.OnItemClickListener {
private Context context;
private View view;
private CommonDialogInterface dialogListener;
private RecyclerView recyclerView;
private List<String> data;
private CommonDialogAdapter adapter;
public CommonDialog(@NonNull Context context, List<String> data, CommonDialogInterface dialogListener) {
super(context);
this.context = context;
this.dialogListener = dialogListener;
this.data = data;
initView();
}
public void notifyDataChanged(){
adapter.notifyDataSetChanged();
}
public void setNewData(List<String> data){
this.data.clear();
this.data.addAll(data);
adapter.notifyDataSetChanged();
}
private void initView() {
view = LayoutInflater.from(context).inflate(R.layout.common_dialog, null);
initList();
setContentView(view);
setCanceledOnTouchOutside(true);
Window window = getWindow();
window.setGravity(Gravity.BOTTOM);
window.setBackgroundDrawable(null);
WindowManager.LayoutParams params = window.getAttributes();
// int[] dim = DensityUtil.getDimension(context);
// params.width = (int) (dim[0] * 0.7);
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(params);
}
private void initList(){
recyclerView = view.findViewById(R.id.recyclerview);
adapter = new CommonDialogAdapter(data);
adapter.setOnItemClickListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
dialogListener.onDialogResult(position,data.get(position));
if (this.isShowing()) {
this.dismiss();
}
}
}
common_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/common_dialog_bg"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
common_dialog_bg.xml 弹框背景,实现了圆角
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/white"></solid>
<!--圆角度数-->
<corners android:radius="10dp"/>
</shape>
CommonDialogAdapter.class
package com.witgo.etcxian.adapter;
import android.support.annotation.Nullable;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.witgo.etcxian.R;
import java.util.List;
public class CommonDialogAdapter extends BaseQuickAdapter<String, BaseViewHolder> {
public CommonDialogAdapter(@Nullable List<String> data) {
super(R.layout.item_common_dialog, data);
}
@Override
protected void convert(BaseViewHolder helper, String item) {
helper.setText(R.id.tv_title_dialog,item);
}
}
item_common_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title_dialog"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text=""
android:textSize="18sp" />
<View style="@style/h_line"></View>
</LinearLayout>
style
<style name="h_line">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">1dp</item>
<item name="android:background">#eeeeee</item>
</style>
2.我建了个简单工厂类,便于直接填充数据,不同数据弹框,调用不同的方法
package com.witgo.etcxian.dialog;
import android.app.Dialog;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
public class DialogFactory {
private DialogFactory(){}
public static DialogFactory getInstance(){
return FactoryHolder.sInstance;
}
private static class FactoryHolder {
public static final DialogFactory sInstance = new DialogFactory();
}
List<String> data = new ArrayList<>();
Dialog dialog;
public Dialog Centi(Context context,CommonDialogInterface dialogInterface){
data.clear();
data.add("身份证");
data.add("行驶证");
dialog = new CommonDialog(context,data,dialogInterface);
return dialog;
}
public Dialog Confirm(Context context,CommonDialogInterface dialogInterface){
data.clear();
data.add("是");
data.add("否");
dialog = new CommonDialog(context,data,dialogInterface);
return dialog;
}
}
3.Activity使用方法 实现CommonDialogInterface
Dialog dialog;
TextView textview;
private void initData() {
dialog = DialogFactory.getInstance().Centi(this,this);
}
@OnClick({R.id.click})
public void onClicked(View view) {
switch (view.getId()) {
case R.id.click:
dialog.show();
break;
}
}
@Override
public void onDialogResult(int position, String value) {
textview.setText(value);
}
build.gradle
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'