5

后,用一个ArrayAdapter ListView控件重置我使用的是ListAdapter填充这样一个ListView:如何获取数据

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

之后,我想提出我的服务器远程调用以获取更多数据该列表与一个AsyncTask调用,并且当我从服务器获取数据时,我不知道如何填充和重置ListView。到目前为止,我有这样的事情:

@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? 
       } 

我可以使结果到适当的结构化数据重置列表中,但不知道如何做到这一点。有人可以帮忙吗? :)

回答

16

我使用这种方式,

values = new ArrayList<String>(); 
    //put anything you want in values as start 
    adapter = new ArrayAdapter<String>(this,R.layout.notification, values); 
    setListAdapter(adapter); 

然后

//change values array with your new data then update the adapter 
    adapter.notifyDataSetChanged(); 

然后ListView中的内容将在时间改变执行此功能

+0

现在让我说......我会告诉你如何去:) – GeekedOut 2012-03-10 15:22:18

+0

啊好吧,这是编译!谢谢! – GeekedOut 2012-03-10 15:27:12

+0

没问题,祝你好运 – 2012-03-10 15:30:10

3
adapter.notifyDataSetChanged(); 

是不错的选择要做到这一点,但有时候不会按我们的需要工作。在这种情况下,您可以再次设置适配器,并刷新您的列表视图。但这不是一个好的选择,因为它再次生成整个listview,所以这会导致性能下降。而你的应用程序变得缓慢。

7

如果您只是想更改数据集,则不需要重新初始化适配器。试试下面的代码 -

adapter.clear(); 
for(int i = 0;i<categoriesArray.length;i++){ 
    adapter.add(categoriesArray[i]); 
} 

如果需要的话,你可以更改通知适配器也是如此,虽然它不应该是必要的。

adapter.notifyDataSetChanged(); 

如果你靶向API级别11或以上,你就可以使用适配器的addAll()方法。因为它更高效。

adapter.clear(); 
adapter.addAll(categoriesArray);