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.
- No se puede utilizar SimpleAdapter en un ListFragment
- Listview con varias columnas de artículos para la tableta?
- Vista de lista de Android con el problema de la casilla de verificación
- Android RecyclerView con SectionIndexer
- TextView en las filas listview que muestran valores repetidos en desplazamiento en Android?
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.
- ListView vacía después de volver al fragmento
- Encabezados ListView de Android
- Mejor práctica: Actualizar ArrayAdapter continuamente
- El efecto Ripple no va por encima de ImageView
- EditText en un adaptador de lista, cómo guardar el valor?
- Cómo crear un número variable de vistas de texto en android
- Android: ListView con CheckBox, poblado desde la base de datos SQLite no funciona
- Cómo crear listview onItemclicklistener
- En su adaptador, cambie los datos de localización [] del array a ArrayList y anule el constructor apropiado
- En su actividad, convierta sus datos variables en un campo (tipo ArrayList
- Cuando agrega una ubicación, puede utilizar data.add (location)
- 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 ().
- Sugerencias para el reconocimiento de dígitos
- Cordova / Phonegap / Ionic App – tienda local de imágenes remotas