I have a main action that creates a ListView and Custom Adapter . I can populate a ListView if I have a List already created in advance, but how can I populate it with dynamically extracted data?
Mainactivity
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; } }
Item
public class Item { private String name; private String desc; public Item(String name, String desc) { super(); this.name = name; this.desc = desc; }
How can I change my code so that the function in the background retrieves the elements in the user adapter and populates the ListView? I tried using AsyncTask but could not get it to work.
Edit : Added the following AsyncTask to MainActivity after onCreate() for validation only. It works in that I can see the score from 1 to 5, and then do it.
How to get AsyncTask to update my adapter and ListView though?
What should onCreate() go to AsyncTask and what should AsyncTask return?
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!"); } }