Android 自定义一个简单常用的列表弹窗Dialog

首先自定义一个dialog继承自dialog

public class CustomDialog extends Dialog {

    private Context c;

    public CustomDialog(@NonNull Context context) {
        super(context);

        c = context;
    }

    public CustomDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);

        c = context;


    }

    protected CustomDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);

        c = context;

    }

    /**
     * 基本列表弹窗
     * @param datas   内容
     * @param dialogListener  位置回调
     */

    public void init(String[]datas, final DialogListener dialogListener){

        View v = LayoutInflater.from(c).inflate(R.layout.dialog_style1,null);
        this.setContentView(v);
        this.setCancelable(true);

        RecyclerView rv = v.findViewById(R.id.rv);
        DialogAdapter adapter = new DialogAdapter(c, datas, new DialogRvListener() {
            @Override
            public void onItemClick(int pos) {

                if (dialogListener!=null){

                    dialogListener.onItemClick(pos);
                    dismiss();

                }

            }
        });

        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(c));

        //窗口位置
        setWindow(getWindow());

    }

    /***
     * 带标题弹窗
     * @param datas   内容
     * @param title    标题
     * @param dialogListener  位置回调
     */

    public void init(String[]datas,String title,final DialogListener dialogListener){

        View v = LayoutInflater.from(c).inflate(R.layout.dialog_style2,null);
        this.setContentView(v);
        this.setCancelable(true);

        //列表
        RecyclerView rv = v.findViewById(R.id.rv);
        DialogAdapter adapter = new DialogAdapter(c, datas, new DialogRvListener() {
            @Override
            public void onItemClick(int pos) {

                if (dialogListener!=null){

                    dialogListener.onItemClick(pos);
                    dismiss();

                }

            }
        });

        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(c));

        //标题
        TextView tv = v.findViewById(R.id.tv_title);
        tv.setText(title);


        //窗口位置
        setWindow(getWindow());

    }

    /***
     * 自定义标题
     * @param datas
     * @param viewId
     * @param dialogListener
     */

    public void init(String[]datas,int viewId,final DialogListener dialogListener){

        LinearLayout v = new LinearLayout(c);
        v.setOrientation(LinearLayout.VERTICAL);

        //自定义标题
        View titleView = LayoutInflater.from(c).inflate(viewId,null);
        LinearLayout.LayoutParams header_params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        v.addView(titleView,header_params);

        //列表
        RecyclerView rv = new RecyclerView(c);
        DialogAdapter adapter = new DialogAdapter(c, datas, new DialogRvListener() {
            @Override
            public void onItemClick(int pos) {

                if (dialogListener!=null){

                    dialogListener.onItemClick(pos);
                    dismiss();

                }

            }
        });


        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(c));
        rv.setId(R.id.rv);
        LinearLayout.LayoutParams rv_params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
        v.addView(rv,rv_params);


        this.setContentView(v);
        this.setCancelable(true);

        //窗口位置
        setWindow(getWindow());

    }


    /**
     * 设置窗口位置
     */

    private void setWindow(Window wd){


        if (wd==null){
            return;
        }
        WindowManager.LayoutParams params = wd.getAttributes();
        params.width = WindowManager.LayoutParams.MATCH_PARENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        wd.setAttributes(params);
        wd.setGravity(Gravity.BOTTOM);

    }

    /**
     * 设置动画
     */

    public void setAnim(int styleId){

        Window w = getWindow();
        if (w==null){
            return;
        }
        w.setWindowAnimations(styleId);

    }

    /**
     * 设置位置
     */

    public void setPosition(int position){
        Window w = getWindow();
        if (w==null){
            return;
        }
        w.setGravity(position);

    }


}

dialog的布局文件(这里只展示无标题栏的)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/ll"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

 <android.support.v7.widget.RecyclerView
     android:id="@+id/rv"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>

</LinearLayout>

dialog里用到recyclerview 的适配器

public class DialogAdapter extends RecyclerView.Adapter<DialogAdapter.DialogViewHolder> {

    private String[]datas;
    private DialogRvListener dialogRvListener;
    private Context c;

    DialogAdapter(Context c, String[] datas, DialogRvListener dialogRvListener){

        this.c = c;
        this.datas = datas;
        this.dialogRvListener = dialogRvListener;

    }


    @NonNull
    @Override
    public DialogViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

        View v = LayoutInflater.from(c).inflate(R.layout.item_dialog,viewGroup,false);

        return new DialogViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull DialogViewHolder holder, final int i) {

        holder.tv.setText(datas[i]);
        holder.tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                dialogRvListener.onItemClick(i);

            }
        });


    }

    @Override
    public int getItemCount() {
        return datas.length;
    }

    class DialogViewHolder extends RecyclerView.ViewHolder{

        TextView tv;
        DialogViewHolder(@NonNull View itemView) {
            super(itemView);

            tv = itemView.findViewById(R.id.tv);
        }
    }
}

recyclerview里item的布局文件,其实就是个textview

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="15sp"
    android:textColor="@android:color/black"
    android:text="123"
    android:gravity="center"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:id="@+id/tv"/>

两个位置接口,其实方法是一样的,写两个只不过为了区分:

DialogListener

void onItemClick(int pos);

DialogRvListener

void onItemClick(int pos);

这样,一个基本的自定义dialog就完成了,只需要在activity里调用即可

  //带标题,同时自定义风格(这样可以保证宽度占满屏幕)
       CustomDialog titledialog = new CustomDialog(this,R.style.customdialog);
        titledialog.init(datas, "请选择", new DialogListener() {
            @Override
            public void onItemClick(int pos) {

                //your logic

            }
        });
//自定义动画
        titledialog.setAnim(R.style.mydialog);

我已经封装好并传到了github,大家直接添加依赖使用即可。如果你觉得好用麻烦点个赞,有什么问题或者好的建议也可以在下方留言。

源码地址
https://github.com/moo611/DesongDialog-Android

发布了4 篇原创文章 · 获赞 2 · 访问量 76

猜你喜欢

转载自blog.csdn.net/qq_39678305/article/details/102930844
今日推荐