在android multichoice对话框中隐藏项目

时间:2013-06-02 09:38:25

标签: android dialog

我正在构建一个多重对话框:

for (int i=0; i<count; i++) {
  options[i] = ...;
  checked[i] = ...;
}

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Options");
builder.setMultiChoiceItems(options, checked, optionsDialogListener);

...

AlertDialog dialog = builder.create();
dialog.show();

但现在我需要一些不可见/禁用的项目,但我仍然需要在我的选项数组中。

有没有办法实现这个目标?我知道它不是正确的方法,但我宁愿不创建自定义适配器。我正在寻找类似“getChildAt”的东西

感谢。

2 个答案:

答案 0 :(得分:1)

您可以通过...

获取相关的ListView
ListView listView = ((AlertDialog) dialog).getListView();

拥有列表视图,您可以将自己的适配器实现(例如MyAdapterArrayAdapter扩展)附加到ListView ...

listView.setAdapter(
    new MyAdapter(this, android.R.layout.simple_list_item_single_choice, 
                        new String[] {"Option 1","Option 2","Option 3"}));

listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int psn, long id) {
        // just as an example: disable all choices
        enabled = new boolean[] {false, false, false};
    }
});

...以您需要的方式覆盖boolean isEnabled(int position)方法:

// maintain your enabled and disabled status here
static boolean enabled[] = {true, true, true}; 

// own adapter relying overriding isEnabled
public class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int textViewResourceId, String[] objects) {
        super(context, textViewResourceId, objects);
    }

    @Override
    public boolean isEnabled(int n) {
        return enabled[n]; 
    }
}

更改isEnabled的条件/标记后,您可能需要调用...

listView.getAdapter().notifyDataSetChanged();

...为了重绘列表视图(但是,在我的测试代码中似乎没有必要)。您可以通过将simple_list_item_single_choice更改为simple_list_item_multiple_choice或其他内容来控制列表视图项样式(检查代码完成情况或创建自己的布局)。

希望这有帮助......干杯!

答案 1 :(得分:0)

最近我遇到了这个问题,我没有设法在不使用自定义适配器的情况下在互联网上找到解决方案。最后,我使用下面的代码

有一个简单的解决方案
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
      ListView lw = ((AlertDialog) dialog).getListView();
      if (which == 0) {
          //for example, disable second and third items after first item is selected
           final ListAdapter adaptor = lw.getAdapter();
           lw.getChildAt(1).setEnabled(false);
           lw.getChildAt(2).setEnabled(false);
      }
   }