2

我正在建立一个多选对话框:

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”的东西

谢谢。

4

2 回答 2

1

你可以得到相关ListView的...

ListView listView = ((AlertDialog) dialog).getListView();

拥有列表视图,您可以将自己的适配器实现(例如MyAdapter从 扩展ArrayAdapter)附加到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(检查代码完成或创建自己的布局可选)。

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

于 2013-06-02T10:00:42.577 回答
1

最近我遇到了这个问题,如果不使用自定义适配器,我无法在互联网上找到解决方案。最后我有一个简单的解决方案,使用下面的代码

    @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);
      }
   }
于 2017-03-16T16:44:59.117 回答