Spinner con elementos de casilla de verificación, ¿es posible?Spinner con elementos de casilla de verificación, ¿es posible?
Respuesta
Eso depende de a qué te refieras.
Si quiere una verdadera selección múltiple Spinner
, entonces no hay nada integrado en Android para eso.
Tenga en cuenta que tiene el control sobre lo que se incluye en las filas Spinner
de la lista desplegable, excepto el botón de opción. Si quiere poner casillas de verificación en sus filas, sea mi invitado. Se verá extraño, puede que no funcione correctamente con respecto a los eventos táctiles, no eliminará los botones de radio (AFAIK) y no tendrá ninguna relación con los contenidos del Spinner
en modo normal. Por lo tanto, no puedo recomendar este enfoque, pero es factible.
El código fuente Spinner
está disponible en el proyecto de código abierto de Android, por lo que le invitamos a clonarlo y desarrollar un MultiSelectSpinner
o algo así.
Puede crear un ListView con casillas de verificación. Incluso podría agregarlo a un diálogo. Eso es esencialmente todo lo que es un spinner.
¡Buena idea! ¡Gracias! –
Puede utilizar el 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);
}
}
Y luego, en su diseño .xml:
<xxx.xx.gui.MultiSpinner android:id="@+id/SpinnerCollegues"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/university"/>
probar este
<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);
}
}
creé una dinámica llena Spinner que recibe su contenido a través de la consulta de bases de datos SQLite sobre el sistema de resolución de contenido, que es una imagen en lugar de texto cuando está cerrado, muestra cuál es seleccionada , y su impresionante :-) sencilla
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);
}
Ahora, parece que un simple Spinner, lo que hace que se muestre su selección es esta línea, llenará los valores y poner un radioCheckbox en el lado derecho, la parte superior/1ra El elemento en su lista será preseleccionado.
adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
hay varios otros diseños predefinidos Wich trabajo bastante bien
- simple_list_item_checked -> muestra una marca de verificación en lugar de un RadioButton
- simple_list_item_activated_1 o 2 -> Cambia BackgroundColor
- simple_list_item_multiple_choice - > CheckBoxes con checkMarks
para completar aquí está mi diseño, muestra una imagen marcada o no marcada (y no está seleccionada), por lo tanto, especifiqué R.layout.ghost_text en spinnerAdapter.
<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" />
aquí mi onItemSelecte que necesita las interfaces OnItemSelectedListener. Lo que hace, mantiene un seguimiento con un booleano si es la inicialización de la ruleta o no. Si hay un clic real, extraemos la información y actualizamos otro Elemento UI sobre un Controlador (también podría ser una devolución de llamada) si el Elemento Pulsado es el Elemento Seleccionado Estándar configuro el SpinnerImage no seleccionado, si es otro, entonces el elemento estándar que configuro la imagen de spinner seleccionada.
@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));
}
}
}
se implementa un MultiSpinner, se puede encontrar en AndroidArsenal
lo encuentro en Maven Repository
Si añade un toque a él, se ve bien: androide: pista = "Elija ... "
- 1. Eliminar elementos múltiples por casilla de verificación
- 2. Casilla de verificación Grails
- 3. Preseleccionar casilla de verificación con rieles Simple_form
- 4. Android Casilla de verificación Grupo
- 5. Combobox con casilla de verificación en winforms
- 6. casilla de verificación ASP.NET con jQuery
- 7. Casilla de verificación parcialmente seleccionada con javascript
- 8. jsTree Ocultar casilla de verificación
- 9. Casilla de verificación en ExpandableListView
- 10. QT - casilla de verificación desmarque
- 11. jquery, casilla de verificación deseleccionar por valor
- 12. Casilla de casilla de verificación DataGridView "seleccionar todo" rendimiento
- 13. ¿es posible poner la imagen en el tipo de entrada = "casilla de verificación"?
- 14. ¿Es posible hacer que una casilla de verificación/botón de opción no sea verificable?
- 15. Spinner borrar elementos
- 16. Seleccionar Todos los elementos de un ListView (fila personalizada con casilla de verificación)
- 17. Android ListView con casilla de verificación: desmarca automáticamente
- 18. ExtJS 4 seleccionar múltiples casillas de verificación CheckColumn con casillero de casilla de verificación
- 19. Marca de verificación en una casilla de verificación
- 20. ¿Es posible crear una señal para cuando se active una casilla de verificación QTreeWidgetItem?
- 21. ¿Cómo marcar una casilla de verificación con jQuery?
- 22. Selector de contactos de Android con casilla de verificación
- 23. OnItemClickListener no funcionaba con la casilla de verificación?
- 24. Estilo de casilla de verificación de Android
- 25. Pares de casilla de verificación/alineación vertical
- 26. Problema de visibilidad de Android con la casilla de verificación
- 27. jQuery - Casilla de verificación de estilo, reemplace con la imagen
- 28. asp: UpdatePanel con un activador de casilla de verificación ASP.NET
- 29. Posible asociar la etiqueta con la casilla de verificación sin usar "for = id"?
- 30. ¿Es posible expresar una restricción de verificación?
Gracias! Parece que es demasiado problema, tal vez usaré otro enfoque. –