¿Cómo actualizar dinámicamente un ListView con un adaptador personalizado?

Tengo una actividad principal que crea un ListView y un Custom Adapter . Puedo rellenar el ListView si ya tengo la Lista creada de antemano, pero ¿cómo la relleno con datos obtenidos dinámicamente?

Actividad principal

 public class MainActivity extends Activity { private ListView myListView; private Context ctx; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.MainActivity); ctx = this; List<Items> myList = new ArrayList<Items>(); myList.add(new Item("Name 1", "Desc 1")); myList.add(new Item("Name 2", "Desc 2")); myList.add(new Item("Name 3", "Desc 3")); myList.add(new Item("Name 4", "Desc 4")); myList.add(new Item("Name 5", "Desc 5")); myListView = (ListView)findViewById(R.id.list); MyListAdapter myAdapter = new MyListAdapter(ctx,R.layout.listitem, myList); myListView.setAdapter(myAdapter); } } 

MyListAdapter

 public class MyListAdapter extends ArrayAdapter<Items> { private int resource; private LayoutInflater mLayoutInflater; public MyListAdapter ( Context ctx, int resourceId, List<Items> objects) { super( ctx, resourceId, objects ); resource = resourceId; mLayoutInflater = LayoutInflater.from( ctx ); } @Override public View getView ( int position, View convertView, ViewGroup parent ) { convertView = ( RelativeLayout ) mLayoutInflater.inflate( resource, null ); Items item = (Items) getItem( position ); TextView txtName = (TextView) convertView.findViewById(R.id.listName); txtName.setText(item.getName()); TextView txtDesc = (TextView) convertView.findViewById(R.id.listDescription); txtDesc.setText(item.getDesc()); return convertView; } } 

ít.

 public class Item { private String name; private String desc; public Item(String name, String desc) { super(); this.name = name; this.desc = desc; } //getters and setters } 

¿Cómo puedo modificar mi código de tal manera que una función en el fondo recupera los artículos al adaptador de encargo y rellena el ListView? Intenté usar un AsyncTask pero no pude conseguirlo para que funcione.


Editar : Se agregó el AsyncTask siguiente en MainActivity después onCreate() sólo para probar las cosas. Está trabajando en que puedo ver el conteo de 1 a 5 y luego hecho.
¿Cómo consigo el AsyncTask para actualizar mi adaptador y ListView sin embargo?
¿Qué debe onCreate() pasar a AsyncTask y qué debe AsyncTask devolver?

 private class GetItems extends AsyncTask<Void, Integer, Void> { @Override protected void onPreExecute() { super.onPreExecute(); TextView myMsg = (TextView)findViewById(R.id.topMsg); myMsg.setText("Loading..."); } @Override protected Void doInBackground(Void... params) { TextView myMsg = (TextView)findViewById(R.id.topMsg); for (int i=1;i<=5;i++) { try { Thread.sleep(1000); publishProgress(i); } catch (InterruptedException e) { } } return null; } protected void onProgressUpdate(Integer... values) { TextView myMsg = (TextView)findViewById(R.id.topMsg); myMsg.setText(Integer.toString(values[0].intValue())); } @Override protected void onPostExecute(Void result) { TextView myMsg = (TextView)findViewById(R.id.topMsg); myMsg.setText("Done!"); } } 

Cada vez que añada nuevos datos debe hacer esto:

Adapter.notifyDataSetChanged ()

Por ejemplo:

Database.insert (datos);

MyAdapter.notifyDataSetChanged ();

O:

 myAdapter.mySetNewContentMethod(someNewContent); myAdapter.notifyDataSetChanged(); 

Después de actualizar la llamada del adaptador

 myAdapter.notifyDataSetChanged(); 

Esto actualizará dinámicamente la vista de lista.

Ver esto para más información LINK

He intentado el método más simple para actualizar la lista cuando usted suprime un artículo de él. Espero que mi código te ayude. Código

  //Custom Adatpter package com.example.smsptclapp; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemLongClickListener; public class CustomAdapter extends BaseAdapter { static List<String> result; //ArrayList<SingleRow> list; Activity context; static TextView tv; static int k,count; // int [] imageId; //for Image private static LayoutInflater inflater = null; public CustomAdapter(Activity activity, List<String> prgmNameList) { // TODO Auto-generated constructor stub result = prgmNameList; context = activity; //imageId = prgmImages; //for Image inflater = ( LayoutInflater )context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); } public CustomAdapter(OnClickListener onClickListener, List<String> listItems) { // TODO Auto-generated constructor stub } @Override public int getCount() { // TODO Auto-generated method stub return result.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } public static int getCounter() { return count; } public static int getPosition() { return k; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub //Object cd1= getItem(position); View rowView; rowView = inflater.inflate(R.layout.program_list, null); tv=(TextView) rowView.findViewById(R.id.textView1); tv.setLongClickable(true); tv.setText(result.get(position)); rowView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { k = position; Intent i = new Intent(context, Menu.class); context.startActivity(i); } }); return rowView; } } // In Main Type these lines ss =listItems.get(i); // where 'ss' is global string, 'i' is the location you want to delete, and 'listItems' is global variable of 'List<String>' type. db.deleteUser(ss); //'db' is global variable of database and deleteUser is method to delete entry from data base only listItems.remove(i); //to remove the entry from list ie to refresh it you must call this listgroups.setAdapter(new CustomAdapter(this,listItems)); //'listgroups' is 'ListView', which is also global. 
  • ¿Cómo puede escuchar los eventos de clic en un ListView que se producen fuera de los elementos de la lista?
  • Cómo actualizar algunos datos en un ListView sin utilizar notifyDataSetChanged ()?
  • Altura dinámica para la fila ListView en android
  • Prueba de la interfaz de usuario de Android con Expresso: No hay actividades en la etapa REANUDADO
  • No puede hacer clic en la fila listview con imagebutton
  • HeaderViewListAdapter se bloquea de forma aleatoria
  • ListView y Id ocultos. ¿Como es posible?
  • Actualización de Android ListView con SimpleCursorAdapter
  • Quite el divisor inferior de un ListView de Android
  • Cómo actualizar un CursorAdapter vinculado a listview cuando el número de elementos cambia?
  • ArrayAdapter número de elementos en conjunto de datos es cero
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.