[英]Android - after notifyDataSetChanged ListView remains blank
[英]Android ListView not updating after a call to notifyDataSetChanged
我有一個活動,我這樣開始:
public class MyProblemsActivity extends ListActivity
{
String[] PROBLEMS = new String[] {"One", "Two", "Three" };
ArrayAdapter adapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
adapter = new ArrayAdapter<String>(this,R.layout.my_problems, PROBLEMS);
setListAdapter(adapter);
ListView lv = getListView();
lv.setTextFilterEnabled(true);
這完全沒問題。
我遇到的問題是在通過Asynch調用調用遠程服務器后,我這樣做:
@Override
protected void onPostExecute(String result)
{
PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
adapter.notifyDataSetChanged();
}
但屏幕不會更新。 我在這里做錯了什么?如何使用新值更新屏幕?
謝謝!!
發生了什么事
PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
PROBLEMS
是獲取對new
字符串數組對象的引用...因此舊引用保持不變(未更改)..
要糾正它,請使用以下內容:
PROBLEMS.clear();
List<String> newlist = new ArrayList<String>();
newlist.add(..);
..
PROBLEMS.addAll(newlist);
adapter.notifyDataSetChanged();
這樣,新字符串將僅添加到由PROBLEMS指出的現有數組引用中
注意:我已經提到通過引用字符串的arraylist而不是string []來使用它的clear(),addAll()功能,你可以根據你的用途修改它為String []。
我讀到您從異步回調更新了列表。 我的情況也一樣。 我去UI線程中運行它,突然它按預期工作! (如果你不這樣做,通常你會得到一個例外。在這里它不會刷新列表。)對於我的看法,其他答案只是解決方法。
所以,改變你的代碼如下:
@Override
protected void onPostExecute(String result)
{
runOnUiThread(new Runnable() {
@Override
public void run() {
PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
adapter.notifyDataSetChanged();
}
});
};
如果您想要一個更簡單的答案,您可以將代碼更改為如下所示:
@Override
protected void onPostExecute(String result)
{
PROBLEMS = new String[] {"Hello", "Bye", "Hmmmmmm" };
adapter.clear();
adapter.addAll(PROBLEMS);
adapter.notifyDataSetChanged();
}
這會更改ArrayAdapter的內容以在新的String []中包含字符串,然后通知ListView ArrayAdapter具有新內容。 這將導致ListView更新並顯示您的新字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.