title: Android: How do I make a ListView update itself periodically?
body: <p>I never got this working in a straightforward manner. Sorry if I'm being a little vague. I'll try to elaborate on what I'm trying to do. I am trying to build a listview that grabs its data from a webservice. Once I initialize a listview, I want to keep polling the webserver periodically and update the contents of the listview. For this I am doing something like this:</p>
  
  <pre><code>public class SampleAutoUpdateList extends Activity {
  
       //Autoupdate handler
       private Handler handler = new Handler();
       private Runnable updater = new Runnable() {
  
       public void run() {
  
         /*
          * Update the list 
          */
  
         try {
            Log.i("UPDATE", "Handler called");
            searchAdapter = getFeed(URL);
            searchAdapter.notifyDataSetChanged();
            handler.postDelayed(this, Configuration.REFRESH_INTERVAL);
         } catch(Exception e) {
            Log.e("UPDATE ERROR", e.getMessage());
         }
  
        }
  
       };
  
       /** Called when the activity is first created. */
       @Override
       public void onCreate(Bundle savedInstanceState) {
  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.linearmode);
        this.context = this;
  
        searchAdapter = getFeed(URL);
        LinearLayout l2 = (LinearLayout) findViewById(R.id.secondaryLayout);
        ListView list = new ListView(context);
        l2.addView(list);
        // display UI
        UpdateDisplay(list);
        updater.run();
       }
  
       private SearchAdapter getFeed(String URL) {
          try
          {
              SearchHandler handler = new SearchHandler();
  
              URL url = new URL(URL);
  
              String data = convertStreamToString(url.openStream());
              data = data.substring(data.indexOf('['), data.length()-1);
                      handler.parseJSON(data);
  
              return handler.getFeed();
          }
          catch (Exception ee)
          {
              // if we have a problem, simply return null
              Log.e("getFeed", ee.getMessage());
              return null;
          }
      }
  
      private void UpdateDisplay(View searchView) {
          // TODO Auto-generated method stub
          // TODO Auto-generated method stub
          searchList = (ListView) searchView;
  
          myProgressDialog = ProgressDialog.show(this,       
                  "Please wait...", "Loading search....", true); 
  
          new Thread() { 
              public void run() { 
                  try{ 
  
                      Thread.sleep(2000); 
                  } catch (Exception e) {  } 
  
                  runOnUiThread(new Runnable() { 
  
                      @Override 
                      public void run() { 
  
                          if (searchAdapter == null)
                          {
                              Log.e("ERROR", "No Feed Available");
                              return;
                          }
  
                          searchAdapter.setContext(context);
                          searchList.setAdapter(searchAdapter);
                          searchList.setSelection(0);
                      } 
                  }); 
  
                  // Dismiss the Dialog 
                  myProgressDialog.dismiss(); 
              } 
          }.start(); 
      }
  }
  </code></pre>
  
  <p>And the SearchHandler class is simple:</p>
  
  <pre><code>public class SearchHandler  extends DefaultHandler {
      SearchAdapter _adapter;
      SearchItem _item;
  
      public SearchHandler()
      {
      }
  
      public SearchAdapter getFeed()
      {
          return _adapter;
      }
  
      public void parseJSON(String data) {
          // TODO Auto-generated method stub
          _adapter = new SearchAdapter();
          JSONArray parseArray;
          try {
              parseArray = new JSONArray(data);
                      for (int i=0; i &lt; parseArray.length(); i++) {
  
                  SearchItem item = new SearchItem();
  
                  JSONObject jsonUser = parseArray.getJSONObject(i);
                  item.set_from(jsonUser.getString ("from"));
                  item.set_msg(jsonUser.getString("msg"));
              }
          } catch (JSONException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
  }
  </code></pre>
  
  <p>No matter what I do, the handler gets called and the new items are fetched, but the list is never refreshed... Any ideas on what could be going wrong?</p>