禁用 alertDialog 中的复选框项目

roo*_*per 2 android android-alertdialog

我让数组通过警报对话框选择多个选项 如果数组已满,我想禁用选择

我已经能够在达到限制后停止向数组添加项目,但无法禁用复选框

 AlertDialog.Builder builder=new AlertDialog.Builder(this);
 View view=inflater.inflate(R.layout.dialog_genre,null,false);
 builder.setView(view).setTitle("Select Genres");

 builder.setMultiChoiceItems(array, checkedGenres, new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which, boolean isChecked) {
            if(isChecked) {
                if (!selectedgenre.contains(String.valueOf(which)))
                    if(selectedgenre.size()<5)
                {
                    selectedgenre.add(String.valueOf(which));
                    checkedGenres[which]=true;
                }
                else{
                        Toast.makeText(getApplicationContext(),"you can't add more genres",Toast.LENGTH_LONG).show();
                    }
            }
            else if (selectedgenre.contains(String.valueOf(which)))
            {
             selectedgenre.remove(String.valueOf(which));
             checkedGenres[which]=false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Bor*_*rda 7

ListView 中的视图是可重用的,因此项目并没有真正链接到视图。但是,您可以在将视图添加到 AlertDialog 的 ListView 中的 ListView 时启用或禁用该视图。ViewGroup.setOnHierarchyChangeListener允许您这样做。

    final CharSequence[] items = new CharSequence[]
            {"9×19mm Sidearm", ".40 Dual Elites", "228 Compact", "Night Hawk .50C"};
    boolean[] checkedItems = new boolean[]{false, false, true, true};
    final boolean[] disabledItems = new boolean[]{false, true, false, true};

    Context context = this;
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
    dialogBuilder.setTitle("Select your pistol");

    dialogBuilder.setMultiChoiceItems(items, checkedItems,
            new DialogInterface.OnMultiChoiceClickListener() {
        @Override
        public void onClick(DialogInterface dialogInterface, int i, boolean checked) { 

        }
    });

    AlertDialog alertDialog = dialogBuilder.create();
    alertDialog.getListView().setOnHierarchyChangeListener(
            new ViewGroup.OnHierarchyChangeListener() {
        @Override
        public void onChildViewAdded(View parent, View child) {
            CharSequence text = ((AppCompatCheckedTextView)child).getText();
            int itemIndex = Arrays.asList(items).indexOf(text);
            child.setEnabled(disabledItems[itemIndex]);
        }

        @Override
        public void onChildViewRemoved(View view, View view1) {
        }
    });

    alertDialog.show();
Run Code Online (Sandbox Code Playgroud)

代码示例的结果(Android 9,API 28)

请注意,setEnable不会避免 clickListeners 触发。如果您不想让您的复选框点击添加child.setOnClickListener(null)