自定义dialog实例子

这里写图片描述\
如图:点击某一个按钮在下方显示一个dialog,外形可以自定义,item可以自定义,点击效果可以自定义;

自定义的dialog:

public class MoreTopicDialog extends Dialog {

    public MoreTopicDialog(Activity context) {
        super(context);
    }


    public MoreTopicDialog(Activity context, int themeResId) {
        super(context, themeResId);
    }

    public static class Builder {
        private Activity context;
        private List<MoreTopicModel> classModels;
        protected ListView mListView;
        private AdapterView.OnItemClickListener onItemClickListener;
        private CommonAdapter<MoreTopicModel> adapter;
        private float scale;
        private int screenWidth;

        public Builder(Activity context) {
            this.context = context;
            scale = context.getResources().getDisplayMetrics().density;
            screenWidth = ScreenTools.getWidth(context);
        }

        public Builder setItems(List<MoreTopicModel> classModels) {
            this.classModels = classModels;
            adapter = new CommonAdapter<MoreTopicModel>(context, R.layout.item_more_topic, classModels) {
                @Override
                public void convert(ViewHolder holder, MoreTopicModel classModel) {
                    holder.setImageResource(R.id.iv_icon, classModel.getItemIcon());
                    holder.setText(R.id.tv_title, classModel.getItem());
                }
            };
            return this;
        }


        public Builder setOnItemClickListener(AdapterView.OnItemClickListener listener) {
            this.onItemClickListener = listener;
            return this;
        }

        public MoreTopicDialog create() {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            final MoreTopicDialog dialog = new MoreTopicDialog(context, R.style.more_dialog_dialog);
            dialog.setCanceledOnTouchOutside(true);
            dialog.setCancelable(true);

            View layout = inflater.inflate(R.layout.layout_more_topic, null);

            dialog.addContentView(layout, new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));


            if (classModels.size() != 0) {
                mListView = (ListView) layout.findViewById(R.id.lv_more_topic);
                mListView.setAdapter(adapter);
                mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                                            int position, long id) {
                        onItemClickListener.onItemClick(parent, view, position, id);
                        dialog.dismiss();
                    }

                });
            }
            dialog.setContentView(layout);

            Window dialogWindow = dialog.getWindow();
            WindowManager.LayoutParams lp = dialogWindow.getAttributes();
            dialogWindow.setGravity(Gravity.RIGHT | Gravity.TOP);

            int i = (int) (50 * scale + 0.5f);
            lp.x = 18; // 新位置X坐标
            lp.y = i; // 新位置Y坐标
            lp.width = screenWidth*2 / 3; // 宽度
            dialogWindow.setAttributes(lp);
            return dialog;

        }
    }
}

数据模型:

public class MoreTopicModel {
    private String itemid;
    private int itemIcon;
    private String item;
}

自定义的一个adapter

public abstract class CommonAdapter<T> extends BaseAdapter
{
    protected Context mContext;
    protected List<T> mDatas;
    protected LayoutInflater mInflater;
    private int layoutId;

    public CommonAdapter(Context context,int layoutId, List<T> datas )
    {
        this.mContext = context;
        mInflater = LayoutInflater.from(context);
        this.mDatas = datas;
        this.layoutId = layoutId;
    }

    @Override
    public int getCount()
    {
        return mDatas.size();
    }

    @Override
    public T getItem(int position)
    {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        ViewHolder holder = ViewHolder.get(mContext, convertView, parent,
                layoutId, position);
        convert(holder, getItem(position));
        return holder.getConvertView();
    }

    public abstract void convert(ViewHolder holder, T t);

}

使用方法

 <style name="more_dialog_dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <!--边框-->
        <item name="android:background">@drawable/frame_more_topic</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:backgroundDimAmount">0.6</item>
    </style>

使用实例

 new MoreTopicDialog
                 .Builder(ViewPointActivity.this)
                 .setItems(viewModel.getMoreTopicList())
.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
   @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
{

}}).create().show();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值