2010-05-26 99 views
0

我已经创建了一个自定义列表视图,它看起来是Twitter的时间表,并包含帖子。以下函数从服务器获取帖子列表,解析它们并将它们添加到用于填充列表视图的列表中。ListView没有得到更新调用notifyDataSetChanged()

public void populateTimeline(){ 
     Thread populate = new Thread(){ 
      public void run(){ 
       Looper.prepare(); 
       InputStream data = getData(serviceURL); //gets a jsonarray of posts from server $ post_list 
       if(data!= null) 
        try { 

          String jsonString = responsetoString(data); 
          Log.d(TAG, jsonString); 
          PostList list = getPostList(jsonString); 
          List <PostContainer> post_list = list.getPostContainterList(); 
          PostContainer pc; 
          for (int i = 0; i < post_list.size(); i++) {    
           pc = post_list.get(i); 
           mObjectList.add(pc.getPost()); //Adding each post to the list 
           Log.d(TAG, pc.post.username); 
           Log.d(TAG, pc.post.message); 
          } 

        } catch (Exception e) { 
         Log.d(TAG, "Exception" + e.getMessage()); 
         e.printStackTrace(); 
        } 
       Looper.loop();    
      } 

     }; 
     populate.start(); 
    } 

调用该函数后,列表适配器在数据集中在主线程中调用

adapter.notifyDataSetChanged(); 

通知的变化。但是,该列表视图不会更新。为了追踪目的,我在列表视图顶部添加了一个按钮, 再次调用populateTimeline(),然后在点击按钮时调用notifyDataSetChanged()。令人惊讶的是,这次在ListView中弹出所有帖子。

应该怎么做才能更新列表视图没有按钮点击?

回答

1

我正在使用Gson来解析Json,并且花了太长时间来解析json数组并填充了导致adapter.notifyDataSetChanged被调用的列表,甚至在调用之前有任何更改列表。所以我将notifyDataSetChanged转换为函数,并在延迟(Thread.sleep())后调用它来解决问题。

0

adapter.notifyDataSetChanged();应该在UI /主线程上调用

+0

它正在主线程中调用。 – primpap 2010-05-26 15:26:09

+0

你如何在主线程上调用它? – 2010-08-30 22:37:33

+0

你可以通过使用这里描述的Handler类来实现:http://www.vogella.de/articles/AndroidPerformance/article.html – 2011-10-06 16:25:57

相关问题