底部弹框Dialog工具类

该博客介绍了如何实现一个底部弹框Dialog,利用RecycleView动态加载数据,并结合BaseQuickAdapter进行填充。同时定义了CommonDialogInterface接口处理点击回调。此外,还创建了一个简单工厂类以便于根据不同数据调用不同的弹框方法。在实际应用中,Activity需要实现CommonDialogInterface接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个底部的选择弹框,选用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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值