How to dynamically update a ListView using a custom adapter?

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; } //getters and setters } 

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!"); } } 
+5
source share
3 answers

Whenever you add new data, you should do this:

adapter.notifyDataSetChanged ()

For instance:

database.insert (data);

myAdapter.notifyDataSetChanged ();

OR

 myAdapter.mySetNewContentMethod(someNewContent); myAdapter.notifyDataSetChanged(); 
+6
source

After updating adapter call

 myAdapter.notifyDataSetChanged(); 

This will dynamically update the list view.

See this for more information. LINK

+2
source

I tried the simplest method of updating a list when I delete an item from it. Hope my code helps you. The code

  //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. 
0
source

Source: https://habr.com/ru/post/1498541/


All Articles