How to reset the ListView with the ArrayAdapter after fetching data

29,225

Solution 1

I use it this way,

    values = new ArrayList<String>();
    //put anything you want in values as start
    adapter = new ArrayAdapter<String>(this,R.layout.notification, values);
    setListAdapter(adapter);

then

    //change values array with your new data then update the adapter
    adapter.notifyDataSetChanged();

then the listview content will change at the time you execute this function

Solution 2

You do not need to reinitialize the adapter, if you just want to change the data set. Try the following code -

adapter.clear();
for(int i = 0;i<categoriesArray.length;i++){
    adapter.add(categoriesArray[i]);
} 

after that if required, you can notify the change to the adapter too, although it shouldn't be necessary.

adapter.notifyDataSetChanged();

if you're targetting API level 11 or above, you can use addAll() method on adapter. Since it's more efficient.

adapter.clear();
adapter.addAll(categoriesArray);

Solution 3

adapter.notifyDataSetChanged();

is good option to do this, but sometimes that wont work as we need. In that case you can setadapter again and your listview get refreshed. But this is not good option to do because it genrates whole listview again so this cause performance very down. And your app get slow.

Share:
29,225
GeekedOut
Author by

GeekedOut

Recently started working on http://www.problemio.com Thank you to all the people on StackOverflow who have helped me. Could not have made the progress I did without your help!! EDIT: I LOOOOOOOOOOVE STACKOVERFLOW. THANK YOU TO ALL THE AMAZING PEOPLE HERE!!!!

Updated on July 25, 2020

Comments

  • GeekedOut
    GeekedOut almost 4 years

    I am using an ListAdapter to populate a ListView like this:

    static final String[] PROBLEMS = new String[] {"one", "two", "three" };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);        
    
        setListAdapter(new ArrayAdapter<String>(this, R.layout.my_problems, PROBLEMS));
    
        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
    

    and after that I am making a remote call to my server to get more data for that list with an AsyncTask call, and when I get the data back from the server I don't know how to populate and reset the ListView. So far I have something like this:

        @Override
        protected void onPostExecute(String result) 
        {       
                // Unwrap the stuff from the JSON string                
                String problem_title = null;
                String problem_id = null;
    
                try
                {
                    JSONArray obj = new JSONArray(result);
                    JSONObject o = obj.getJSONObject(0);                    
    
                    Log.d( "Title: " , "" + o.getString("problem_title") );       
                    Log.d( "id: " , "" + o.getString("problem_id") );      
    
                    problem_title = o.getString("problem_title");
                    problem_id = o.getString("problem_id");
                }
                catch ( Exception e )
                {
                }
    
                // Now not sure what to do :)
                // How do I reset the list that I had set up above?
                    }
    

    I can make the result into appropriately structured data to reset the list but not sure how that is done. Can someone please help? :)