2010-02-04 3 views
4

나는이 일을 결코 간단하게하지 못했습니다. 미안해 내가 조금 애매하다. 내가하려는 일에 대해 자세히 설명하려고 노력할 것이다. 나는 webservice에서 데이터를 잡는 listview를 만들려고 노력하고있다. 일단 listview를 초기화하면 웹 서버를 정기적으로 폴링하고 listview의 내용을 업데이트하려고합니다.Android : ListView 업데이트 자체를 주기적으로 어떻게 작성합니까?

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

을 상관없이, 핸들러가 호출되고 새 항목이 페치됩니다 내가 뭘 그러나 목록 결코 상쾌하게되지 않습니다 ... 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까?

+0

몇 단락을 추가하여 더 자세하게 설명하고 계시겠습니까? 그러면 사람들이 답을 줄 수 있습니다. – CommonsWare

+0

죄송합니다 ... 죄송합니다 ... 방금 내 질문을 업데이트했습니다 ... – Legend

답변

4

글쎄, 코드 조각을 가지고 있기 때문에 코드를 따라 가기가 약간 어렵고, 정말 관련이있는 비트가 거의 없기 때문에. 예를 들어, 사용 가능한 코드를 기반으로하면 searchAdapterListView과 연관시키지 않으므로 목록은 항상 비어 있어야합니다.

말했다되고 그건

다음 라인은 특히 이상하게 보일 : 나는 getFeed() (도시되지 않음) 어떤 종류의 새로운 ListAdapter을 생성한다고 가정하기 위하여려고하고있다

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

. getFeed()이 새로운 ListAdapter을 생성하는 경우 데이터 세트가 변경되지 않았으므로 notifyDataSetChanged()에 전화 할 필요가 없습니다. 이는 완전히 새로운 것입니다. 또한이 새로운 ListAdapterListView에 연결하지 않으면 새 ListAdapter이 적용되지 않습니다.

내가 잘못된 트리를 작성하는 경우 getFeed()의 구현과 searchAdapter을 사용하는 위치를 보여주는 샘플을 추가하는 것을 고려해보십시오.

+0

죄송합니다 다시 .. 나는 게시 된 내용이 거대하면 아무도 검토하지 않을 것이라고 생각했습니다. 그러나 이제는 내가 건너 뛰는 부분이 가장 중요하다는 것을 깨닫습니다. 모든 관련 부분으로 업데이트되었습니다 ... – Legend

+0

좋습니다, 그럼, 내 대답은 정확하다고 생각합니다. SearchHandler는 매번 새로운 어댑터를 생성합니다. 그러나, 나는 당신이 어댑터를 ListView에 한 번만 연관시키는 것을 UpdateDisplay()에서 볼 것입니다. 따라서 두 번째 및 후속 어댑터는 방금 작성한 후 버려집니다. – CommonsWare

+0

흠 .. 웬일인지, 나는 이것이 문제라고 결코 생각하지 않았다. 그래서 매번 ListView와 다시 연관 시키거나 다른 방법을 제안합니까? – Legend

관련 문제