How to reset the ListView with the ArrayAdapter after fetching data
Asked Answered
T

3

7

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? :)

Theorize answered 10/3, 2012 at 15:14 Comment(0)
S
18

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

Scuba answered 10/3, 2012 at 15:20 Comment(2)
Let me try that now...I'll tell you how it went :)Theorize
ah ok, it is compiling! Thanks!Theorize
T
8

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);
Terret answered 24/7, 2014 at 10:48 Comment(0)
P
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.

Panama answered 10/3, 2012 at 15:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.