Android Dialog

AlertDialog的多选列表样式

  AlertDialog的多选样式列表在单选的基础上可以多选,使用了 CheckBox来多选

案例

R.array.hobby字符串资源文件


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="hobby">
        <item>吃饭</item>
        <item>上网</item>
        <item>睡觉</item>
        <item>LOL</item>
    </string-array>
</resources>

java文件 这里基本上需要考虑下标使用集合管理的问题

  1. 下标使用集合存储维护
  2. 下次再出出现AlertDialog的时候需要有选中或者非选中状态
  3. 集合里面存储的是下标,那么删除的时候需要注意下标转换成包装类Integer,不然集合会当自己的下标删除
  4. 集合里面存储的小标,在拿出集合下标的时候需要按照下标的大小排序,不然顺序没有保证,这个需要按照实际需求来处理

public class MainActivity extends AppCompatActivity {

    TextView t1;
    String[] hobby;
    AlertDialog alertDialog;
    //多选选择事件
    DialogInterface.OnMultiChoiceClickListener onMultiChoiceClickListener;
    //dialog按钮事件
    DialogInterface.OnClickListener onClickListener;
    //选择的对象的下标
    ArrayList<Integer> arrayListSelectIndex;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        t1=(TextView)findViewById(R.id.t1);
        //实例化选中对象的小标集合
        arrayListSelectIndex=new ArrayList();
        //获取字符串数组资源
        hobby=getResources().getStringArray(R.array.hobby);

        //多选事件
        onMultiChoiceClickListener=new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if(isChecked)
                {
                    //如果选中就添加下标
                    arrayListSelectIndex.add(which);
                }
                else
                {
                    //如果没有选中就移除下标
                    //注意移除的时候,如果是int型数据,一定要注意转换成Integer,否则集合会认为是自己的下标
                    arrayListSelectIndex.remove(Integer.valueOf(which));
                }
            }
        };

        //dialog按钮事件
        onClickListener=new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {


                if(which==AlertDialog.BUTTON_POSITIVE)
                {
                    //为了保持数组下标的顺序,这里需要集合排序
                    Collections.sort(arrayListSelectIndex);
                    //输出集合
                    StringBuffer stringBuffer=new StringBuffer();
                     for (int i=0;i<arrayListSelectIndex.size();i++)
                     {
                         stringBuffer.append(hobby[arrayListSelectIndex.get(i)]);
                         stringBuffer.append("\r\n");
                     }
                    t1.setText(stringBuffer.toString());
                }
                if(which==AlertDialog.BUTTON_NEGATIVE)
                {
                    dialog.dismiss();
                }

            }
        };
    }


    public  void  btn1(View view)
    {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setTitle("多选内容");

        //设置一个选中的数组
        boolean[] checkItem=   new boolean[]{false, false, false, false};
        //从以前选中的下标集合,设置选中数组,那个下标需要选中
        for (int i=0;i<arrayListSelectIndex.size();i++)
        {
            checkItem[arrayListSelectIndex.get(i)]=true;
        }

        //设置多选数组和事件
        //参数1:items 依赖的字符串数组
        //参数2:checkedItems 默认选项,数据类型为boolean[],主要这个参数的个数需要和依赖的字符串数组的个数相匹配
        //参数3:listener 事件 数据类型为onMultiChoiceClickListener
        builder.setMultiChoiceItems(hobby, checkItem, onMultiChoiceClickListener);
        builder.setPositiveButton("确定", onClickListener);
        builder.setNegativeButton("返回", onClickListener);
        alertDialog=builder.create();
        alertDialog.show();
    }

}

第一次打开AlertDialog

然后选中吃饭、上网

然后确定按钮

第二次打开AlertDialog

然后选中LoL和吃饭

然后确定按钮