Spinner a través de adaptador

De Manuais Informática - IES San Clemente.
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)
Ir a la navegación Ir a la búsqueda

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).