为了账号安全,请及时绑定邮箱和手机立即绑定

Android Spinner有多种选择

Android Spinner有多种选择

凤凰求蛊 2019-08-31 14:49:29
如何创建允许选择多个项目的微调器,即带有复选框的微调器?
查看完整描述

3 回答

?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我编写了MultiSpinner的自定义实现。它看起来类似于普通的微调器,但它有复选框而不是radiobuttons。选定的值显示在微调器上除以逗号。默认情况下会检查所有值。试试吧:


package cz.destil.settleup.gui;


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(android.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中使用它像这样:


<cz.destil.settleup.gui.MultiSpinner android:id="@+id/multi_spinner" />

你用Java将数据传递给它:


MultiSpinner multiSpinner = (MultiSpinner) findViewById(R.id.multi_spinner);

multiSpinner.setItems(items, getString(R.string.for_all), this);

你还需要实现一个监听器,它将返回相同长度的数组,使用true或false来显示所选的未选择状态。


public void onItemsSelected(boolean[] selected);


查看完整回答
反对 回复 2019-08-31
?
catspeake

TA贡献1111条经验 获得超0个赞

谢谢你的帖子!好的解决方案 我对类(方法setItems)进行了一些小改动,以允许用户设置已选择的项目,而不是默认选择所有项目为true。


public void setItems(

    List<String> items,

    List<String> itemValues, 

    String selectedList,

    String allText,

    MultiSpinnerListener listener) {

        this.items = items;

        this.defaultText = allText;

        this.listener = listener;


        String spinnerText = allText;


        // Set false by default

        selected = new boolean[itemValues.size()];

        for (int j = 0; j < itemValues.size(); j++)

            selected[j] = false;


        if (selectedList != null) {

            spinnerText = "";

            // Extract selected items

            String[] selectedItems = selectedList.trim().split(",");


            // Set selected items to true

            for (int i = 0; i < selectedItems.length; i++)

                for (int j = 0; j < itemValues.size(); j++)

                    if (selectedItems[i].trim().equals(itemValues.get(j))) {

                        selected[j] = true;

                        spinnerText += (spinnerText.equals("")?"":", ") + items.get(j);

                        break;

                }

    }


        // Text for the spinner

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),

            android.R.layout.simple_spinner_item, new String[] { spinnerText });

        setAdapter(adapter);

}


查看完整回答
反对 回复 2019-08-31
  • 3 回答
  • 0 关注
  • 718 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信