Android: Как мне периодически обновлять ListView? - PullRequest
4 голосов
/ 04 февраля 2010

У меня никогда не получалось так просто работать. Извините, если я немного расплывчат. Я постараюсь уточнить, что я пытаюсь сделать. Я пытаюсь создать просмотр списка, который получает данные из веб-службы. Как только я инициализирую просмотр списка, я хочу периодически опрашивать веб-сервер и обновлять содержимое списка. Для этого я делаю что-то вроде этого:

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(); 
    }
}

А класс SearchHandler прост:

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 < 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();
        }
    }
}

Независимо от того, что я делаю, вызывается обработчик и выбираются новые элементы, но список никогда не обновляется ... Любые идеи о том, что может пойти не так?

1 Ответ

4 голосов
/ 04 февраля 2010

Ну, немного сложнее следовать вашему коду, поскольку у вас есть только его фрагмент и несколько действительно важных битов. Например, исходя из вашего доступного кода, ваш список должен быть всегда пустым, поскольку вы никогда не ассоциируете searchAdapter с ListView ... по крайней мере в коде, который вы показали.

При этом следующие строки кажутся особенно странными:

        searchAdapter = getFeed(URL);
        searchAdapter.notifyDataSetChanged();

Я собираюсь предположить, что getFeed() (не показан) создает новый ListAdapter некоторого вида. Если getFeed() создает новый ListAdapter, нет необходимости вызывать notifyDataSetChanged(), так как его набор данных не изменился - он совершенно новый. Более того, если вы не ассоциируете этот новый ListAdapter со своим ListView, новый ListAdapter не будет иметь никакого эффекта.

Если я лаю не на том дереве, рассмотрите возможность добавления строк к вашему примеру, показывающих реализацию getFeed() и где вы используете searchAdapter.

...