No es un bug, es una característica no documentada

domingo, 18 de octubre de 2015

Programación multimedia. Controles de selección

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
  •  ArrayAdapter. Provee datos a la lista de selección a partir de un array de objetos
  • 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