相关文章推荐
买醉的熊猫  ·  中国矿业联合会_中国矿业网 中国国际矿业大会·  4 月前    · 
狂野的白开水  ·  pyenv 让 python 版本完美切换 ...·  1 年前    · 
爱运动的围巾  ·  哥布林洞窟百度云 - 百度·  1 年前    · 
刚分手的咖啡豆  ·  1.10.珷玞:Jooq - Zero冥思录·  2 年前    · 
神勇威武的日记本  ·  如何使table表格td中超出的文字以省略号 ...·  2 年前    · 
Code  ›  安卓自定义列表dialog开发者社区
dialog android开发 自定义dialog alertdialog
https://cloud.tencent.com/developer/article/1385740
不羁的书签
2 年前
作者头像
先知先觉
0 篇文章

安卓自定义列表dialog

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 伟大程序猿的诞生 > 正文

安卓自定义列表dialog

发布 于 2019-01-21 15:32:04
962 0
举报

前言

很早之前写过一篇 自定义提示信息Dialog 这个形式也是最常用的,不过最近需要用到列表信息 Dialog ,原生的不光样式不能满足需求,而且是开发电视端的APP,需要对焦点进行特殊处理,所以就需要自定义 Dialog

我们先来看一下系统自带的列表Dialog。

系统自带列表Dialog

第一种:纯列表

我们先来看第一种:

最简单的一种,没有当前状态,只有列表,选中之后弹框就会消失(非手动调用 dialog.dismiss() )

代码如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setItems(new String[]{"科目一", "科目二", "科目三"}, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
    }).create();
alertDialog.show();

第二种:单选列表

这种列表会有checked提示, setSingleChoiceItems() 中第二个参数就是控制第几个被选中,而且点击之后不会自动消失,需要手动调用 dialog.dismiss() ,有时会配合 setNegativeButton()、setPositiveButton 等一起使用。

代码如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setSingleChoiceItems(new String[]{"科目一", "科目二", "科目三"}, 0, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
    }).create();
alertDialog.show();

第三种:多选列表

这种列表也会有checked提示,而且是多选框, setSingleChoiceItems() 的第二个参数是boolean数组,控制哪些被选中。而且点击之后也不会自动消失,需要手动调用 dialog.dismiss() ,有时会配合 setNegativeButton()、setPositiveButton() 等一起使用。

代码如下:

AlertDialog alertDialog = new AlertDialog
    .Builder(MainActivity.this)
    .setMultiChoiceItems(new String[]{"科目一", "科目二", "科目三"}, new boolean[]{true, false, true}, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            Toast.makeText(MainActivity.this,"选择了第"+which+"个",Toast.LENGTH_SHORT).show();
    }).create();
alertDialog.show();

自定义Dialog

看了系统自带的效果你会发现不能满足UI的效果,那么接下来进行我们的自定义。

第一步:自定义item的布局文件

item布局文件 dialog_item.xml 代码

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/contentConstraintLayout"
    android:layout_width="@dimen/dp_450"
    android:layout_height="@dimen/dp_85">
    <TextView
        android:id="@+id/typeTextview"
        android:textSize="@dimen/sp_30"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:text="256Kbps"
        android:textColor="@color/color_212121"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <ImageView
        android:id="@+id/stateImageView"
        android:layout_width="@dimen/dp_65"
        android:layout_height="@dimen/dp_65"
        android:layout_marginEnd="17dp"
        android:background="@drawable/diglog_sel"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

图片选中效果 diglog_sel.xml 代码

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/selected" android:state_selected="true" />
    <item android:drawable="@android:color/transparent" />
</selector>

第二步:自定义adapter

我这里只是传递一些简单的数据到adapter,具体看实际业务传递不同的数据,控制不同的效果。

public class DialogItemAdapter extends BaseAdapter {
    //这里可以传递个对象,用来控制不同的item的效果
    //比如每个item的背景资源,选中样式等
    public List<String> list;
    LayoutInflater inflater;
    public DialogItemAdapter(Context context, List<String> list) {
        this.list = list;
        inflater = LayoutInflater.from(context);
    @Override
    public int getCount() {
        return list.size();
    @Override
    public String getItem(int i) {
        if (i == getCount() || list == null) {
            return null;
        return list.get(i);
    @Override
    public long getItemId(int i) {
        return i;
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.dialog_item, null);
            holder.typeTextview = (TextView) convertView.findViewById(R.id.typeTextview);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        holder.typeTextview.setText(getItem(position));
        return convertView;
    public static class ViewHolder {
        public TextView typeTextview;
}

第三步:使用

DialogItemAdapter adapter = new DialogItemAdapter(MainActivity.this, iniDatas());
AlertDialog alertDialog = new AlertDialog
     .Builder(MainActivity.this)
    .setSingleChoiceItems(adapter, 0, new DialogInterface.OnClickListener() {
        @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
    }).create();
alertDialog.show();
public List<String> iniDatas() {
    List<String> list = new ArrayList<String>();
 
推荐文章
买醉的熊猫  ·  中国矿业联合会_中国矿业网 中国国际矿业大会
4 月前
狂野的白开水  ·  pyenv 让 python 版本完美切换 - 苍青浪 - 博客园
1 年前
爱运动的围巾  ·  哥布林洞窟百度云 - 百度
1 年前
刚分手的咖啡豆  ·  1.10.珷玞:Jooq - Zero冥思录
2 年前
神勇威武的日记本  ·  如何使table表格td中超出的文字以省略号显示-码云笔记
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号