【问题标题】:Spinner with checkbox items, is it possible?带有复选框项目的微调器,有可能吗?
【发布时间】:2019-10-22 18:34:30
【问题描述】:

带有复选框项目的微调器,可以吗?

【问题讨论】:

    标签: android checkbox spinner


    【解决方案1】:

    试试这个

     <selva.spinner.multispinner android:id="@+id/multi_spinner" 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    

    Spinner1Activity.java

        package selva.spinner;
    
        import java.util.ArrayList;
        import java.util.List;
        import selva.spinner.multispinner.multispinnerListener;
        import android.app.Activity;
        import android.os.Bundle;
    
        public class Spinner1Activity extends Activity  implements multispinnerListener
        {
    
         @Override
         public void onCreate(Bundle savedInstanceState)
        {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        multispinner ms = (multispinner) findViewById(R.id.multi_spinner);
        List<String> list = new ArrayList<String>();
        list.add("one");
        list.add("two");
        list.add("three");
        list.add("four");
        list.add("five");
        list.add("six");
        list.add("seven");
        list.add("eight");
        list.add("nine");
        list.add("ten");
        ms.setItems(list, "select", this);
    
      }
    
    @Override
    public void onItemschecked(boolean[] checked)
    {
        // TODO Auto-generated method stub
    
    }
    }
    

    multispinner.java

     package selva.spinner;
    
     import java.util.List;
     import android.app.AlertDialog;
     import android.content.Context;
     import android.content.DialogInterface;
     import android.content.DialogInterface.OnCancelListener;
     import android.content.DialogInterface.OnMultiChoiceClickListener;
     import android.util.AttributeSet;
     import android.widget.ArrayAdapter;
     import android.widget.Spinner;
    
    
    public class multispinner extends Spinner implements
    OnMultiChoiceClickListener, OnCancelListener 
    {
          private List<String> listitems;
          private boolean[] checked;
    
          public multispinner(Context context) 
          {
              super(context);
          }
    
          public multispinner(Context arg0, AttributeSet arg1)
          {
              super(arg0, arg1);
          }
    
          public multispinner(Context arg0, AttributeSet arg1, int arg2) 
          {
              super(arg0, arg1, arg2);
          }
    
          @Override
          public void onClick(DialogInterface dialog, int ans, boolean isChecked)
          {
              if (isChecked)
                  checked[ans] = true;
              else
                  checked[ans] = false;
          }
    
    
        @Override
          public void onCancel(DialogInterface dialog)
          {
    
            String str="Selected values are: ";
    
                for (int i = 0; i < listitems.size(); i++)
                {
                            if (checked[i] == true)
                            {
                            str=str+"   "+listitems.get(i);
                            }
    
                }
    
                    AlertDialog.Builder alert1 = new AlertDialog.Builder(getContext());
    
                    alert1.setTitle("Items:");
    
                    alert1.setMessage(str);
    
                    alert1.setPositiveButton("Ok", null);
    
                    alert1.show();
    
    
          }
    
          @Override
          public boolean performClick()
          {
              AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
              builder.setMultiChoiceItems(
                        listitems.toArray(new CharSequence[listitems.size()]), checked, this);
              builder.setPositiveButton("done",
                      new DialogInterface.OnClickListener()
              {
    
                  @Override
                  public void onClick(DialogInterface dialog, int which)
                  {
                      dialog.cancel();
                  }
              });
              builder.setOnCancelListener(this);
              builder.show();
              return true;
          }
    
          public void setItems(List<String> items, String allText,
                  multispinnerListener listener)
          {
              this.listitems = items;
    
              checked = new boolean[items.size()];
              for (int i = 0; i < checked.length; i++)
                  checked[i] =false;
    
    
              ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
                      android.R.layout.simple_spinner_item, new String[] { allText });
              setAdapter(adapter);
            }
    
          public interface multispinnerListener 
          {
              public void onItemschecked(boolean[] checked);
          }
    
     }
    

    【讨论】:

    • 哇!这太棒了!谢谢
    【解决方案2】:

    这取决于你的意思。

    如果您想要一个真正的多选 Spinner,那么 Android 中没有内置任何东西。

    请注意,您可以控制下拉列表的 Spinner 行中的内容,单选按钮除外。如果您想在行中放置复选框,请成为我的客人。它看起来很奇怪,在触摸事件方面可能无法正常工作,不会删除单选按钮(AFAIK),并且在正常模式下与Spinner 的内容完全无关。因此,我不能推荐这种方法,但它是可行的。

    Spinner 的源代码可从 Android 开源项目中获得,因此欢迎您克隆它并开发 MultiSelectSpinner 或其他东西。

    【讨论】:

    • 谢谢!看来太麻烦了,也许我会用另一种方法。
    【解决方案3】:

    您可以使用 multiSpinner:

    import java.util.List;
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.DialogInterface.OnCancelListener;
    import android.content.DialogInterface.OnMultiChoiceClickListener;
    import android.util.AttributeSet;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    
    public class MultiSpinner extends Spinner implements OnMultiChoiceClickListener, OnCancelListener {
    
        private List<String> items;
        private boolean[] selected;
        private String defaultText;
        private MultiSpinnerListener listener;
    
        public MultiSpinner(Context context) {
        super(context);
    }
    
    public MultiSpinner(Context arg0, AttributeSet arg1) {
        super(arg0, arg1);
    }
    
    public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) {
        super(arg0, arg1, arg2);
    }
    
    @Override
    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
        if (isChecked)
            selected[which] = true;
        else
            selected[which] = false;
    }
    
    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner
        StringBuffer spinnerBuffer = new StringBuffer();
        boolean someUnselected = false;
        for (int i = 0; i < items.size(); i++) {
            if (selected[i] == true) {
                spinnerBuffer.append(items.get(i));
                spinnerBuffer.append(", ");
            } else {
                someUnselected = true;
            }
        }
        String spinnerText;
        if (someUnselected) {
            spinnerText = spinnerBuffer.toString();
            if (spinnerText.length() > 2)
                spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        } else {
            spinnerText = defaultText;
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
                android.R.layout.simple_spinner_item,
                new String[] { spinnerText });
        setAdapter(adapter);
        listener.onItemsSelected(selected);
    }
    
    @Override
    public boolean performClick() {
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setMultiChoiceItems(
                items.toArray(new CharSequence[items.size()]), selected, this);
        builder.setPositiveButton(R.string.ok,
                new DialogInterface.OnClickListener() {
    
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }
    
    public void setItems(List<String> items, String allText,
        MultiSpinnerListener listener) {
        this.items = items;
        this.defaultText = allText;
        this.listener = listener;
    
        // all selected by default
        selected = new boolean[items.size()];
        for (int i = 0; i < selected.length; i++)
            selected[i] = true;
    
        // all text on the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
                android.R.layout.simple_spinner_item, new String[] { allText });
        setAdapter(adapter);
    }
    
    public interface MultiSpinnerListener {
        public void onItemsSelected(boolean[] selected);
    }
    

    }

    然后在你的布局中.xml:

    <xxx.xx.gui.MultiSpinner android:id="@+id/SpinnerCollegues"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:prompt="@string/university"/>
    

    【讨论】:

      【解决方案4】:

      您可以只创建一个带有复选框的 ListView。您甚至可以将其添加到对话框中。这基本上就是一个微调器。

      【讨论】:

        【解决方案5】:

        实现了一个MultiSpinner,你可以在AndroidArsenal上找到它

        可以在Maven Repository找到它

        如果你给它添加一个提示,看起来不错: android:hint="选择..."

        【讨论】:

          【解决方案6】:

          我创建了一个动态填充 Spinner,它通过内容解析器通过 Sqlite 数据库查询获取其内容,关闭时它是图像而不是文本,它显示选择的内容,而且非常简单:-)

                  spinnerFavorites = (SpinnerMultiSameClick) v.findViewById(R.id.guide_btn_favorites);
                  spinnerFavorites.setOnItemSelectedListener(this);    
                  ContentResolver resolver = activity.getContentResolver();
                  String[] projection = new String[] { DataContract.Favorites.FAVORITES_ID, DataContract.Favorites.NAME };
          
                  Cursor cursor = resolver.query(DataContract.Favorites.CONTENT_URI, projection, null, null, DataContract.Favorites.FAVORITES_ID +" ASC");
                  if (cursor.getCount() > 0) {
                      // create an array to specify which fields we want to display
                      String[] from = new String[] { DataContract.Favorites.NAME, DataContract.Favorites.FAVORITES_ID };
                      // create an array of the display item we want to bind our data
                      // to
                      int[] to = new int[] { android.R.id.text1, android.R.id.text2 };
                      SimpleCursorAdapter adapter = new SimpleCursorAdapter(activity, R.layout.ghost_text, cursor, from, to,
                              SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
          
                      // get reference to our spinner
                      spinner.setAdapter(adapter);
          
                      adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
          
          
                  } else {
                      // TODO: Maybe button to make new favList               
                      spinnerFavorites.setVisiblity(View.GONE);
          
                  }
          

          现在,它看起来像一个简单的 Spinner,使它显示其选择的是这一行,它将填充值并在右侧放置一个 radioCheckbox,列表中的顶部/第一个元素将被预选。

          adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
          

          还有其他几个预定义的布局非常好用

          • simple_list_item_checked -> 显示复选标记而不是 RadioButton
          • simple_list_item_activated_1 或 2 -> 更改背景颜色
          • simple_list_item_multiple_choice -> 带有复选标记的复选框

          在这里完成的是我的布局,它显示了一个标记或未标记的图像(而不是选择了什么),因此我在 spinnerAdapter 中指定了 R.layout.ghost_text。

                  <com.netstream.ch.tv.android.ui.program.guide.land.SpinnerMultiSameClick
                  android:id="@+id/guide_btn_favorites"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_marginLeft="5dp"
                  android:layout_marginRight="5dp"
                  android:background="@drawable/icon_selector_guide_filter_favorites"
                  android:clickable="true" />
          

          这里是我的 onItemSelecte,它需要 OnItemSelectedListener 接口。它的作用是用布尔值跟踪它是否初始化微调器。如果有真正的点击,我们提取信息并通过控制器更新另一个 UI 元素(也可以是回调)如果 Clicked 元素是 StandardSelected 元素我设置 SpinnerImage 未选中,如果它的其他然后标准元素我设置选择的 spinnerImage。

          @Override
          public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
          
              if (parent.getId() == R.id.guide_btn_favorites) {
          
                  if (!AbsintheViewControllerFactory.getGuideController().isFavoriteListInitialisation()) {
                      Cursor c = (Cursor) parent.getItemAtPosition(pos);
                      String favid = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.FAVORITES_ID));
                      String name = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.NAME));
                      Log.d(TAG, "Set Filter to FavListId: " + favid + " by its name: " + name);
                      if (favid.equalsIgnoreCase(GuideViewController.allChannelsFavoritesIdentifier)) {
                          spinnerFavorites.setSelected(false);
                      } else {
                          spinnerFavorites.setSelected(true);
                      }
                      AbsintheViewControllerFactory.getGuideController().setFavourites(favid);
          
                      guideInfoSelectedFavoriteList.setText(name);
                  } else {
                      AbsintheViewControllerFactory.getGuideController().setFavoriteListInitialisation(false);
                      guideInfoSelectedFavoriteList.setText(getActivity().getResources().getString(R.string.FILTER_FAVORITE_ALL_CHANNELS));
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多