【问题标题】:Multiple choice AlertDialog with custom Adapter带有自定义适配器的多项选择 AlertDialog
【发布时间】:2012-06-07 13:29:29
【问题描述】:

我正在尝试创建一个带有多项选择选项的 AlertDialog。我尝试过使用setMultiChoiceItems,但我拥有的是ArrayList<Category>,而不是CharSequence,所以我尝试使用适配器。

setAdapter 的问题在于,当我选择一项时,它会关闭对话窗口。我想要的是选择项目,然后点击 OK 按钮查看选择了哪些项目。

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("Pick a color");
        ArrayAdapter<Category> catsAdapter = new ArrayAdapter<Category>(this, android.R.layout.select_dialog_multichoice,this.categories);
        builder.setAdapter(catsAdapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {

            }
        });
        builder.setPositiveButton("Save", new DialogInterface.OnClickListener() {
               @Override
               public void onClick(DialogInterface dialog, int which) {
                //do something  
               }                
        });;

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

【问题讨论】:

  • 为什么不动态创建一个自定义视图,其中包含您的 ArrayList 填充的单选按钮?您可以为警报对话框设置自定义视图,然后手动检查 setPositiveButton 中的框雕像
  • 我想要适配器的代码。可以给我吗?

标签: android android-alertdialog android-arrayadapter multiple-choice


【解决方案1】:

不幸的是,似乎没有一种简单的方法可以在不调用 setMultiChoiceItems() 的情况下切换 AlertDialog 的多选模式。

但是,您可以设置一个适配器,然后在包含的ListView 本身中打开多选模式。

final AlertDialog dialog = new AlertDialog.Builder(getActivity())
    .setTitle("Title")
    .setAdapter(yourAdapter, null)
    .setPositiveButton(getResources().getString(R.string.positive), null)
    .setNegativeButton(getResources().getString(android.R.string.cancel), null)
    .create();

dialog.getListView().setItemsCanFocus(false);
dialog.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
dialog.getListView().setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view,
        int position, long id) {
        // Manage selected items here
        System.out.println("clicked" + position);
        CheckedTextView textView = (CheckedTextView) view;
        if(textView.isChecked()) {

        } else {

        }
    }
});

dialog.show();

【讨论】:

    【解决方案2】:

    这将阻止您的对话框在一次选择后消失。

    AlertDialog alertDialog = builder.create();
    ListView listView = alertDialog.getListView();
    listView.setOnItemClickListener(new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // TODO Auto-generated method stub
    
        }
    });
    

    要获得选择了哪些项目,您需要相应地规划您的适配器。

    【讨论】:

      【解决方案3】:

      请参阅下面的代码,它可能会对您有所帮助。我在我的应用程序中使用了它。

      public static ArrayList<String> Party_list_new = new ArrayList<String>();
      
      ArrayList<String> party_multi_cheked = new ArrayList<String>();
      
      public void show_alert() {
      
              final Dialog dia = new Dialog(this);
              dia.setContentView(R.layout.alert_);
              dia.setTitle("Select File to import");
              dia.setCancelable(true);
      
              final ListView list_alert = (ListView) dia
                      .findViewById(R.id.alert_list);
      
              list_alert.setAdapter(new ArrayAdapter<String>(getApplicationContext(),
                      android.R.layout.simple_list_item_multiple_choice,
                      Party_list_new));
      
              list_alert.setItemsCanFocus(false);
              list_alert.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
              list_alert.setOnItemClickListener(new OnItemClickListener() {
      
                  public void onItemClick(AdapterView<?> arg0, View arg1, int pos,
                          long arg3) {
      
                  }
              });
      
              Button btn = (Button) dia.findViewById(R.id.button1);
              btn.setOnClickListener(new OnClickListener() {
                  public void onClick(View v) {
      
                      SparseBooleanArray positions = list_alert
                              .getCheckedItemPositions();
                      int j = 0;
      
                      for (int k = 0; k < Party_list_new.size(); k++) {
                          if (positions.get(k)) {
      
                              party_multi_cheked.add("" + k);
      
      
                          }
                      }
      
                      dia.dismiss();
                  }
              });
              dia.show();
      
          }
      

      alert_list.xml

          <?xml version="1.0" encoding="UTF-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/linearLayout1"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >
               <Button
                  android:id="@+id/button1"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:text="Select Party" />
      
              <ListView
                  android:id="@+id/alert_list"
                  android:layout_width="match_parent" android:padding="5dp"
                  android:layout_height="wrap_content" >
              </ListView>
      
          </LinearLayout>
      

      如果它是正确的,就让它正确。

      【讨论】:

      • 不完全是我想要的,因为它“破坏”了我拥有的另一个 AlertDialog 的样式。
      猜你喜欢
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      相关资源
      最近更新 更多