带有复选框项目的微调器,是否可能?

时间:2010-04-21 11:52:33

标签: android checkbox spinner

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

6 个答案:

答案 0 :(得分:6)

这取决于你的意思。

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

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

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

答案 1 :(得分:6)

试试这个

 <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 :(得分: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"/>

答案 3 :(得分:2)

您可以使用复选框创建ListView。您甚至可以将其添加到对话框中。这基本上都是一个微调器。

答案 4 :(得分:2)

实施了MultiSpinner,你可以在AndroidArsenal上找到它

可以在Maven Repository

找到它

如果你添加一个提示,看起来不错: android:提示=&#34;选择......&#34;

答案 5 :(得分:0)

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

        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 - &gt;显示checkMark而不是RadioButton
  • simple_list_item_activated_1或2 - &gt;更改BackgroundColor
  • simple_list_item_multiple_choice - &gt; CheckBoxes with checkMarks

这里完成的是我的布局,它显示了一个标记或未标记的图像(而不是选择的是什么),因此我在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));
        }
    }
}