2012-06-20 50 views
2

我知道你可以调用notifyDataSetChanged();在这种情况下你会怎么做 - 这甚至有可能吗?如何在Android中刷新ListView

 ListView listView = getListView(); 
     listView.setTextFilterEnabled(true); 
     setListAdapter(new ArrayAdapter<String>(Items.this, R.layout.list, items)); 

编辑:我已更改为以下建议之一。这是我在做什么:

protected void onPostExecute(Void v) { 

     adapter = new ArrayAdapter<String>(Items.this, R.layout.list, items); 
     setListAdapter(adapter); 

     adapter.notifyDataSetChanged(); 

    } 

这里我刷新一个AsyncTask方法。这是在ListLiew顶部的一个带有Submit按钮的对话框中调用的。对话框将新数据插入到数据库中,我希望列表刷新到哪里来反映这一点。我已经尝试了上面的代码,并且在对话框中的按钮的onClick内部。在对话被解除之前。

+0

您是否使用新插入的元素更新了您的物品列表,然后尝试通知适配器? – Amal

+0

是的,我打电话给HttpPost,运行脚本通过PHP将数据插入数据库。然后回到Java中,我试图在完成后刷新listview。 – KickingLettuce

回答

0

您需要通过自身初始化ArrayAdapter

ArrayAdapter<String> adapter = new ArrayAdapter<String>(Items.this, R.layout.list, items); 
setListAdapter(adapter); 

...然后调用notifyDataSetChanged()上:

adapter.notifyDataSetChanged(); 

请注意,您只需要调用该方法,如果该数据实际改变;鉴于此,您可能需要将其作为成员变量存储在该类中,以便以后可以访问它。

+0

我记得你的方法是我尝试的方式。不过,我用更多的代码更新了我的问题,但仍然无法正常工作。 – KickingLettuce

+0

首先:尝试'getListView()。setAdapter(...);'。接下来,你确定项目清单已更新吗?使用'items.length'验证这一点。在创建一个新的'ArrayAdapter'并调用'setAdapter'之后,甚至不需要'notifyDataSetChanged'。 – Eric

+0

我不确定它是否更新。我所做的只是向ListView中的数据库中添加一行。然后,我想刷新列表,以便再次形成相同的(MySql)表。 – KickingLettuce

0

你就应该能够在您的ArrayAdapter调用notifyDataSetChanged(),因为ArrayAdapter延伸BaseAdapter

http://developer.android.com/reference/android/widget/ArrayAdapter.html

在你的榜样,你会做这样的事情,采取的是你的意思是叫的ListView。 setListAdapter()

(ArrayAdapter)listView.getAdapter()).notifyDataSetChanged(); 
+0

谢谢;我有更多的信息更新我的问题。 – KickingLettuce

0

在你的榜样,你不应该在你的AsyncTask设置适配器。通常在onCreate()中这样做是个好主意,否则每次调用AsyncTask时都要设置它。如果您将适配器设置为成员变量,那么您应该能够从AsyncTask内调用<adapter>.notifyDataSetChanged()

+0

嘿感谢您的反馈。它实际上是一个成员变量。我将摆脱设置代码,并离开通知。坚韧我相信我已经尝试过了。 – KickingLettuce