Spinner mit Kontrollkästchen Elemente, ist es möglich?Spinner mit Kontrollkästchen Elemente, ist es möglich?
Antwort
Das hängt davon ab, was Sie meinen.
Wenn Sie eine echte multi-select Spinner
wollen, dann ist nichts in Android dafür gebaut.
Beachten Sie, dass Sie die Kontrolle darüber haben, was in den Spinner
Zeilen der Dropdown-Liste mit Ausnahme des Optionsfelds geht. Wenn du Kästchen in deine Reihen setzen willst, sei mein Gast. Es sieht merkwürdig aus, funktioniert möglicherweise nicht richtig in Bezug auf Berührungsereignisse, entfernt die Radioknöpfe (AFAIK) nicht und ist im normalen Modus völlig unabhängig von den Inhalten des Spinner
. Daher kann ich diesen Ansatz nicht empfehlen, aber es ist machbar.
Der Quellcode zu Spinner
ist im Open-Source-Projekt Android verfügbar. Sie können ihn also gerne klonen und MultiSelectSpinner
oder so entwickeln.
Sie könnten einfach ein ListView mit Kontrollkästchen erstellen. Sie könnten es sogar zu einem Dialog hinzufügen. Das ist im Wesentlichen alles, was ein Spinner ist.
Schöne Idee! Vielen Dank! –
können Sie die multiSpinner verwenden:
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);
}
}
Und dann im Layout .xml:
<xxx.xx.gui.MultiSpinner android:id="@+id/SpinnerCollegues"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:prompt="@string/university"/>
Versuchen Sie, diese
<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);
}
}
habe ich eine dynamische gefüllt Spinner, die ihren Inhalt über die SQLite-Datenbank-Abfrage über den Inhalt Resolver wird, ist es ein Bild anstelle von Text ist, wenn sie geschlossen, es zeigt, was ausgewählt und sein genial einfach :-)
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);
}
Nun, es sieht aus wie ein einfacher Spinner, was es seine Auswahl zeigen macht diese Linie ist, wird es die Werte füllen und eine radioCheckbox auf der rechten Seite setzen, die oberen /1 Das Element in Ihrer Liste wird vorausgewählt.
adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
gibt es mehrere andere vordefinierte Layouts Wich Arbeit ziemlich gut
- simple_list_item_checked -> zeigt ein Häkchen statt einer RadioButton-
- simple_list_item_activated_1 oder 2 -> Ändert Background
- simple_list_item_multiple_choice - > CheckBoxen mit CheckMarks
Hier ist mein Layout, es zeigt ein markiertes oder unmarkiertes Bild (und nicht was ausgewählt ist) daher habe ich R.layout.ghost_text im SpinnerAdapter angegeben.
hier meine onItemSelecte, die die OnItemSelectedListener Interfaces benötigt. Was es tut, verfolgt es mit einem Booleschen, wenn es die Initialisierung des Spinner ist oder nicht. Wenn es einen echten Klick gibt, extrahieren wir die Informationen und aktualisieren ein anderes UI-Element über einen Controller (könnte auch ein Callback sein), wenn das angeklickte Element das Standardauswahlelement ist, setze ich das SpinnerImage nicht ausgewählt, wenn es anders ist als das Standardelement, das ich gesetzt habe Das SpinnerImage ausgewählt.
@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));
}
}
}
Es implementiert ein MultiSpinner, können Sie es auf AndroidArsenal finden
Kann es finden auf Maven Repository
Wenn Sie einen Hinweis, um es hinzuzufügen, sieht nett aus: android: Hinweis = "Wählen Sie ... "
- 1. Ist es möglich, ListPreference-Elemente von einem Adapter zu laden?
- 2. WPF ist es möglich, Gridname als Parameter zu Kontrollkästchen Ereignis
- 3. Ist es möglich, ein Kontrollkästchen/Optionsfeld nicht zu aktivieren?
- 4. Android Benutzerdefinierte Spinner Elemente mit Unter Kind
- 5. Ist es möglich, Elemente innerhalb von StackLayout zu animieren?
- 6. Ist es möglich, Variablen als dom-Elemente zu verwenden?
- 7. Wie ist es möglich, einen Spinner mit Bildern anstelle von Text zu erstellen?
- 8. Ist es möglich, Elemente aus PriorityQueue zu entfernen?
- 9. Ist es möglich, Kontrollkästchen mit der Kombination der Klasse zu ändern?
- 10. kivy Spinner Widget mit Mehrfachauswahl
- 11. Swift: ist es möglich,
- 12. Ist es möglich path.Data
- 13. ist es möglich,
- 14. ist es möglich,
- 15. Angular Formly - Ist es möglich, die Felder className mit expressionProperties
- 16. Ist es möglich, scroll auf einer listView zu deaktivieren?
- 17. Ist es möglich, Klassenfelder mit unsicheren
- 18. Ist es möglich, eine Namenskollision mit URLEncoder
- 19. Ist es möglich, RecordCount mit Kriterien
- 20. Ist es möglich, HEADERS mit Response.Redirect anzuhängen?
- 21. Ist es möglich, Daten mit LINQ Pivot?
- 22. Ist es möglich, Platzhalter Pfadparameter mit OkHttp
- 23. Ist es möglich, XHR Antwortdaten mit WebDriver
- 24. Ist es möglich, mit Boost.Hana zu deserialisieren?
- 25. Ist es möglich, HTTP2 mit HTTPListener
- 26. Ist es möglich, mehrere Elemente im Bereich Elemente der Chrome-Entwicklerwerkzeuge auszuwählen?
- 27. Targeting Pseudo-Elemente mit d3 - ist das möglich?
- 28. Wie Anpassen von Kontrollkästchen in Multi-Auswahl-Spinner in Android?
- 29. Ist es möglich onclick = "history.clear();"
- 30. Ist es möglich, CAAnimation abzuleiten?
Danke! Es scheint, es ist zu viel Mühe, vielleicht werde ich einen anderen Ansatz verwenden. –