Android
dispone de diversos controles que nos permiten seleccionar una opción dentro de
una lista de posibilidades
- Spinner
- ListView
- GridView
- Gallery
Asímismo
también tenemos adaptadores. Los adaptadores sirven para enlazar los datos con
alguna de estas listas anteriores. Hay de varios tipos
- SimpleCursorAdapter. Enlaza el control con datos devueltos en un cursor (por ejemplo para consultar a una base de datos o a un ContentProvider).
- ListAdapter
- SpinnerAdapter
- Adaptadores propios que definimos nosotros
ArrayAdapter
Sirve para
ligar clases de AdapterView con un array de objetos. Por defecto <String>
Los pasos
básicos a seguir son:
En el
código hacemos la llamada a un Spinner ya creado
sp1 =
(Spinner)findViewById(…)
Se crea el
adaptador
ArrayAdapter<String>
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, opción)
Mostramos
una interfaz gráfica ya definida en Android
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item);
Asociamos
el adaptador a un spinner
sp1.setAdapter(adapter);
Y con el
siguiente método indicamos que debe hacer cuando cambiar de opción
sp1.setOnItemSelectedListener(this)
Manejando ListAdapter
Para
aprender a manejar los ListAdapter vamos a hacer un ListAdapter que muestre
varias asignaturas e indiquen a que curso pertenece (primero o segundo).
Sección diseño
En el
Layout de la actividad principal insertamos un ListView (situado en el
grupo Containers), y habrá que darle
un id ya definido por Android (@android:id/list)
para poder utilizar el ListAdapter.
Para hacernos una idea, esto es un ListView
en modo diseño
Sección XML
Ahora en el
fichero res/values/strings.xml hay
que crear dos arrays de string. Uno llamado “curso” que tenga tres ítems con
valores 1º, 1º y 2º respectivamente y otro llamado “opcion” que tenga tres ítem
con valores BD, XML y Android.
¿Cómo se
crean estos arrays de string?
<string-array name="curso">
<item>Primer valor</item>
<item>Segundo valor</item>
<item>Tercer valor</item>
</string-array>
Sección java
A
continuación modificamos el fichero MainActivity.java para que su contenido sea
(con los import necesarios) el siguiente e interpreta su contenido.
public class
MainActivity ListActivity{
private TextView tv2;
private ListView lv1;
private String[] cursos;
private String[] asignaturas;
@Override
public void onCreate(Bundle
savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv2 =
(TextView)findViewById(R.id.textView2);
lv1 =
(ListView)findViewById(android.R.id.list);
asignaturas =
getResources().getStringArray(R.array.opcion);
ListAdapter adapter = new
ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
asignaturas);
lv1.setAdapter(adapter);
}
@Override
protected void onListItemClick(ListView l,
View v, int position, long id){
super.onListItemClick(l, v, position,
id);
cursos = getResources().getStringArray(R.array.curso);
tv2.setText(l.getItemAtPosition(position)
+ " es de " + cursos[position]);
}
}
Del
siguiente código hay dos cosas a destacar:
El extends a ListActivity se realiza porque la clase ListActivity nos proporciona los métodos útiles para trabajar con ListAdapter.
El método onListItemClick es el encargado de
detectar una pulsación sobre un elemento del ListActivity. Sus parámetros son:
- l: El ListView donde ocurrió el click
- v: La vista (View) que fue pulsada
- position. La posición de la vista en la lista
- id: El identificador de la fila del ítem que fue pulsado
Mi aplicación de ejemplo
El Layout
tiene el siguiente aspecto
Con los
componentes
Strings.xml
<resources>
<string
name="app_name">ListAdapter</string>
<string
name="hello_world">Hello world!</string>
<string
name="action_settings">Settings</string>
<string-array name="curso">
<item>1º</item>
<item>1º</item>
<item>2º</item>
</string-array>
<string-array name="opcion">
<item>BD</item>
<item>XML</item>
<item>Android</item>
</string-array>
</resources>
Código Java (enmarcado el código modificado)
package
programaciones.inazio.listadapter;
import
android.app.ListActivity;
import android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.view.Menu;
import
android.view.MenuItem;
import
android.view.View;
import
android.widget.ArrayAdapter;
import
android.widget.ListAdapter;
import
android.widget.ListView;
import android.widget.TextView;
import
org.w3c.dom.Text;
public class Listas extends ListActivity {
private TextView
resultado;
private ListView
lista;
private String[]
cursos;
private String[]
asignaturas;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listas);
resultado =
(TextView)findViewById(R.id.lblResultado);
lista =
(ListView)findViewById(android.R.id.list);
asignaturas =
getResources().getStringArray(R.array.opcion);
ListAdapter
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, asignaturas);
lista.setAdapter(adapter);
}
@Override
protected void onListItemClick(ListView
l, View v, int position, long id){
super.onListItemClick(l, v, position, id);
cursos =
getResources().getStringArray(R.array.curso);
resultado.setText(l.getItemAtPosition(position) + " es de " +
cursos[position]);
}
@Override
public boolean onCreateOptionsMenu(Menu
menu) {
// Inflate the menu; this adds items to
the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_listas, menu);
return true;
}
@Override
public boolean
onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here.
The action bar will
// automatically handle clicks on the
Home/Up button, so long
// as you specify a parent activity in
AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return
super.onOptionsItemSelected(item);
}
}
Y al ejecutar la aplicación, podemos ver el
resultado correcto
0 comentarios:
Publicar un comentario