Spinner a través de adaptador
Revisión del 15:21 9 nov 2015 de Angelfg (discusión | contribs.) (→Usando un array estático en Java)
Introdución
- Xa vimos na unidade 2 como crear un Spinner, pero o enlace dos datos co Spinner facíase a través dun atributo XML na definición do Spinner no Layout: android:entries.
- Agora imos facer o mesmo pero usando un adaptador.
- Colleremos os datos dende un array no código e logo dende un recurso XML.
Caso práctico
- Crear o proxecto: U4_02_SpinnerAdapter.
- Cada ítem do Spinner é tratado como unha View, neste caso de tipo TextView.
O XML do layout
- Observar como a vista Spinner non ten a entrada android:entries.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selecciona unha froita" />
<Spinner
android:id="@+id/spin_froitas"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Usando un array estático en Java
- Ao final do código explícase como se enlaza a fonte de datos co adaptador e este co spinner.
- Observar as liñas marcadas.
package com.example.u4_02_spinneradapter;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class U4_02_SpinnerAdapter extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u4_02__spinner_adapter);
Spinner spinFroitas = (Spinner) findViewById(R.id.spin_froitas);
// Fonte de datos
String[] froitas = new String[] { "Pera", "Mazá", "Plátano" };
// Enlace do adaptador cos datos
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, froitas);
// Opcional: layout usuado para representar os datos no Spinner
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Enlace do adaptador co Spinner do Layout.
spinFroitas.setAdapter(adaptador);
// Escoitador
spinFroitas.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
//Toast.makeText(getBaseContext(), "Seleccionaches: " + parent.getItemAtPosition(pos), Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), "Seleccionaches: " + ((TextView) view).getText(), Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}); // Fin da clase anónima
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.u4_02__spinner_adapter, menu);
return true;
}
}
- Liña 23: Definimos a fonte de datos, neste caso un array estático.
- Liña 26: Definimos o adaptador de tipo ArrayAdapter. Pasámoslle como parámetros:
- Contexto,
- O int, identificador de recurso de layout que se vai usar para representar a Vista de Selección, neste caso usamos un predefinido. O usuario pode experimentar con outros tipos (android.R.layout.... CTRL+ESPAZO) e ver que outras formas hai de presentar os datos nun Spinner.
- Un array de obxectos, neste caso de Strings.
- Para ver outros construtores e métodos: http://developer.android.com/reference/android/widget/ArrayAdapter.html
- Liña 29: setDropDownViewResource(int), indica como se vai representar cada un dos ítems do Spinner. Usamos un layout xa predefinido. O usuario pode experimentar usando outros distintos, predefinidos ou propios.
- Liña 32: establece o adaptador que subministra os datos ao Spinner.
- Liña 35: O escoitador é o mesmo que cando non se usaba un adaptador.
- Liñas 38,39: As dúas liñas fan o mesmo, pero no segundo caso observar como recollemos a vista (view) que nos devolve o evento ao premer nun ítem do Spinner. Esa view é do tipo TextView e por iso facemos un cast e logo xa lle podemos aplicar métodos da clase TextView, como getText().
Usando un array de recursos XML
- Usamos o mesmo Layout do exemplo anterior e case o mesmo código, só comentamos a liña de asociación do adaptador coa fonte de datos e engadimos outra sentencia que asocie o adaptador co ficheiro XML.
Ficheiro XML para o array
- En res/values/array_froitas.xml
- Observar o nome do recurso array: froitas
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="froitas">
<item>Pera</item>
<item>Mazá</item>
<item>Plátano</item>
</string-array>
</resources>
O código Java do programa
package com.example.u4_02_spinneradapter;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class U4_02_SpinnerAdapter extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u4_02__spinner_adapter);
Spinner spinFroitas = (Spinner) findViewById(R.id.spin_froitas);
// Fonte de datos. Neste caso obtense dun recurso xml.
//String[] froitas = new String[] { "Pera", "Mazá", "Plátano" };
// Enlace do adaptador cos datos
// ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, froitas);
ArrayAdapter<CharSequence> adaptador = ArrayAdapter.createFromResource(this, R.array.froitas, android.R.layout.simple_spinner_item);
// Opcional: layout usuado para representar os datos no Spinner
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Enlace do adaptador co Spinner do Layout.
spinFroitas.setAdapter(adaptador);
// Escoitador
spinFroitas.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
//Toast.makeText(getBaseContext(), "Seleccionaches: " + parent.getItemAtPosition(pos), Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), "Seleccionaches: " + ((TextView) view).getText(), Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}); // Fin da clase anónima
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.u4_02__spinner_adapter, menu);
return true;
}
}
- Liña 26: Comentamos o anterior construtor e ...
- Liña 28: usamos outro método que nos permita ler un recurso XML: createFromResource(this, R.array.froitas, android.R.layout.simple_spinner_item)
- Contexto,
- Nome do recurso array que contén os ítems,
- O int, identificador de recurso de layout que se vai usar para representar a Vista de Selección, neste caso usamos un predefinido. O usuario pode experimentar con outros tipos (android.R.layout.... CTRL+ESPAZO) e ver que outras formas hai de presentar os datos nun Spinner.
- Para ver outros construtores e métodos: http://developer.android.com/reference/android/widget/ArrayAdapter.html
- No canto de facer cambiar de método puidemos usar o construtor que usamos no primeiro caso:
- Pero antes recollemos o array XML nun array de Strings de datos: String[] froitas = getResources().getStringArray(R.array.froitas);
- O resto non varía.
Uso dun array dinámico
- Nos dous casos anteriores o contido do Spinner é estático e defínese en tempo de compilación, non de execución.
- Se usamos arrays dinámicos podemos crear a fonte de datos en tempo de execución antes de pasarlla ao adaptador.
- Así imos poder usar datos de ficheiros, bases de datos, etc e crear unha fonte de datos para un Spinner en tempo de execución.
package com.example.u4_02_spinneradapter;
import java.util.ArrayList;
import android.R.string;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class U4_02_SpinnerAdapter extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_u4_02__spinner_adapter);
Spinner spinFroitas = (Spinner) findViewById(R.id.spin_froitas);
// Fonte de datos
// String[] froitas = new String[] { "Pera", "Mazá", "Plátano" };
ArrayList<String> froitas = new ArrayList<String>();
froitas.add("Pera");
froitas.add("Mazá");
froitas.add("Plátano");
// Enlace do adaptador cos datos
ArrayAdapter<String> adaptador = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, froitas);
// Opcional: layout usuado para representar os datos no Spinner
adaptador.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Enlace do adaptador co Spinner do Layout.
spinFroitas.setAdapter(adaptador);
// Escoitador
spinFroitas.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
//Toast.makeText(getBaseContext(), "Seleccionaches: " + parent.getItemAtPosition(pos), Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), "Seleccionaches: " + ((TextView) view).getText(), Toast.LENGTH_LONG).show();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}); // Fin da clase anónima
}
private String[] getStringArray(int froitas) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.u4_02__spinner_adapter, menu);
return true;
}
}
- Liñas 23-28: Neste caso os elementos do array engádense en tempo de execución ao array froitas, que neste caso e do tipo ArrayList.
- O resto é exactamente igual.
-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2015).