Adición dinámica de elementos a la vista de lista mediante el adaptador personalizado para la aplicación de Android

Por lo tanto, ahora tengo una clase de adaptador personalizado que tiene en una matriz de ubicaciones y los agrega a un ListView. Esto es todo bien y dandy, pero me gustaría añadir ubicaciones a esta lista después de esta inicialización. Por ejemplo, alguien puede "agregar una ubicación" y lo agregará a este ListView. Aquí está mi actividad principal:

package com.example.listviewtest; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ListView; public class MainActivity extends Activity { private ListView listView1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Location location_data[] = new Location[] { new Location(R.drawable.ic_launcher, "Location 1", "Fruit!", "2 miles", "8-4 mon-fri\nclosed sun"), new Location(R.drawable.ic_launcher, "Location 2", "Veggies!", "2 miles", "8-5"), new Location(R.drawable.ic_launcher, "Location 3", "Plants!", "2 miles", "8-5"), new Location(R.drawable.ic_launcher, "Location 4", "Flowers!", "2 miles", "8-5"), new Location(R.drawable.ic_launcher, "Location 5", "Baked Goods!", "2 miles", "8-5") }; LocationAdapter adapter = new LocationAdapter(this, R.layout.listview_item_row, location_data); //adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5")); listView1 = (ListView)findViewById(R.id.listView1); View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null); listView1.addHeaderView(header); listView1.setAdapter(adapter); } } 

Esto funciona. Quiero ahora hacer algo como adapter.add(new Location(R.drawable.ic_launcher, "Location 6", "Veggies!", "2 miles", "8-5")); Después de llenarlo con la matriz.

Aquí está mi clase LocationAdapter:

 package com.example.listviewtest; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; public class LocationAdapter extends ArrayAdapter<Location>{ Context context; int layoutResourceId; Location data[] = null; public LocationAdapter(Context context, int layoutResourceId, Location[] data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; LocationHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new LocationHolder(); holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); holder.details = (TextView)row.findViewById(R.id.details); holder.distance = (TextView)row.findViewById(R.id.distance); holder.hours = (TextView)row.findViewById(R.id.hours); row.setTag(holder); } else { holder = (LocationHolder)row.getTag(); } Location location = data[position]; holder.txtTitle.setText(location.title); holder.imgIcon.setImageResource(location.icon); holder.details.setText(location.details); holder.distance.setText(location.distance); holder.hours.setText(location.hours); return row; } static class LocationHolder { ImageView imgIcon; TextView txtTitle; TextView details; TextView distance; TextView hours; } } 

¿Alguna idea sobre cómo puedo implementar esto? Gracias.

  1. En su adaptador, cambie los datos de localización [] del array a ArrayList y anule el constructor apropiado
  2. En su actividad, convierta sus datos variables en un campo (tipo ArrayList
  3. Cuando agrega una ubicación, puede utilizar data.add (location)
  4. A continuación, puede llamar a notifyDatasetChanged () en su adaptador

Código de ejemplo: http://androidadapternotifiydatasetchanged.blogspot.in/

Parece que necesita reemplazar el método add en su clase LocationAdapter para agregar el objeto a la lista interna

 @Override public void add(Location location) { super.add(location); data.add(location); } 

Esta implementación requiere que cambie los datos a un ArrayList en lugar de sólo una matriz, de lo contrario tendría que codificar la matriz de volver a dimensionar a ti mismo.

 ArrayList<Location> data = null; // Alternatively use new ArrayList<Location>(); 

Si no lo hace, los datos internos permanecerán sin cambios y una llamada a agregar no cambiará la lista. Esto es malo porque utiliza la variable de datos para obtener los valores de las vistas.

Almacene sus datos en un ArrayList<Location> lugar de sólo Location[] , y luego haga una clase pública en su adaptador de lista:

 ArrayList<Location> data = new ArrayList<Location>(); @Override public void add(Location location) { data.add(location); notifyDataSetChanged(); } 

A continuación, cuando desee agregar un elemento a la lista, llame a location_data.add(new_location) .

Editar: Parece que usted tiene su selección de varias respuestas en su mayoría idénticas.

En su actividad principal, recomendaría usar un ArrayList <Location> en lugar de Location [] para facilitar la adición de nuevos elementos de Location. Entonces, en lugar de tener LocationAdapter extender ArrayAdapter <Location>, haga que extienda ListAdapter <Location> para que pueda pasar su ArrayList <Location> a la misma.

Dicho esto, todo lo que necesita hacer en su método addLocation (Location l) en su MainActivity, es agregar un elemento a la estructura de datos Location [] o ArrayList <Location> que pasó a su adaptador y luego llame a:

 adapter.notifyDataSetChanged(); 

Tenga en cuenta que necesitará que su adaptador sea una variable miembro en su MainActivity para permitir el acceso fuera de su onCreate ().

  • Android: cómo eliminar un elemento de una listaVer y arrayAdapter
  • Deshabilitar elementos de vista de lista con selector y isEnabled ()
  • cuando listview desplazarse ese tiempo edittext establecer el valor predeterminado
  • ¿Cómo puedo añadir un encabezado pegajoso a mi ListView?
  • ¿Cómo evitar que OnItemClickListener trabaje cuando haga clic largo?
  • ¿Hay una manera de desactivar / editar el desvanecimiento que una vista de lista tiene en sus bordes?
  • ¿Cómo puedo reproducir vídeo en ListView como Instagram y Vine?
  • La vista de pie de página para ListView no se muestra en 1 dispositivo, pero está en otro?
  • Guardar datos de ListView utilizando SharedPreferences
  • Android ignora el tamaño de la barra de desplazamiento
  • Cómo eliminar listview todos los elementos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.