2011-12-23 42 views
1

我的項目簡化如下: 首先,我使用應用程序方法Data.java來保存數據。 它包含的數據:如何使用notifyDataSetChanged

private ArrayList<String> data = new ArrayList<String>(); 
public int getsize() { 
return this.data.size(); 
} 
public String getdata(int i) { 
return this.data.get(i); 
} 
public void adddata(String s) { 
return this.data.add(s); 
} 

我AActivity類的onCreate如下:

Data d = (Data)this.getApplication(); 
String test = new String[d.getsize()]; 
for(i = 0; i < d.getsize(); i++) { 
test[i] = d.getdata(i); 
} 
//to show in list 
DataAdapter = new DataAdapter (this, test); 
setListAdapter(DataAdapter); 

當按鈕被點擊,startActivity的BActivity類。 在BActivity類,如下面的代碼:如下

Data d = (Data)this.getApplication(); 
d.adddata("newdata"); 
finish(); 

而且AActivity類的onResume():

@Override 
public void onResume(){ 
super.onResume(); 
this.DataAdapter.notifyDataSetChanged(); 
} 

但是,爲什麼列表不更新? 我確認數據已保存。

我的DataAdapter:

public DataAdapter(Context ctxt, String[] d) { 
this.data = new String[d.length]; 
myInflater = LayoutInflater.from(ctxt); 
int i; 
for(i = 0; i < d.length; i++) { 
data[i] = d[i]; 
} 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewTag viewTag; 
if(convertView == null) { 
convertView = myInflater.inflate(R.layout.row_bookmark_list, null); 
viewTag = new ViewTag((TextView)convertView.findViewById(R.id.tv)); 
convertView.setTag(viewTag); 
} 
else { 
viewTag = (ViewTag) convertView.getTag(); 
} 
viewTag.tv.setText(data[position]); 
} 
class ViewTag { 
TextView tv; 
public ViewTag(TextView t) { 
this.tv = t; 
} 
} 
+0

我試試this.BookmarkAdapter = new NASFilesAdapter(this,d); \t this.setListAdapter(BookmarkAdapter);它再次重置listadapter以顯示列表。這樣做有什麼不利嗎? – brian

回答

12

直接添加新的數據到適配器不是 'd'。適配器保留自己的內部數據,這意味着無論您對'd'所做的更改對適配器都沒有影響。

例如:

List<String> itemsList = new ArrayList<String>(); 
ArrayAdapter aa = new ArrayAdapter(..., itemsList); 
... 
itemsList.add("new item"); --> wrong! 
aa.notifyDataSetChanged(); --> nothing changes, you wrongly added the item to itemsList 

你必須直接與適配器處理:

aa.add("new item");   --> correct 
aa.notifyDataSetChanged(); --> the adapter will reflect the change 
+0

如何將新數據直接添加到適配器? – brian

+0

我編輯了我的答案... – gwa

+0

爲什麼我不能使用aa.add方法? – brian

0

您不能訪問notifyDataSetChanged爲靜態方法
(那你是什麼在你的例子中做)。

如果您有ListActivity:您可以訪問方法getListAdapter()

這就是你的數據集的正確參考。

因此,在短期:

getListAdapter()notifyDataSetChanged();

會做伎倆。如果你沒有ListActivity,那麼你將不得不通過View.findViewById([listview]的id)找到你的listview,並在那裏獲得適配器。

希望這有助於有點:-)

0

我覺得你的問題是,你的DataAdapter被引用到陣列test,但test永遠不會改變。 參考 dataDataAdapter而不是 test應該工作。

好的,在看了Adapter代碼後,它不起作用。你爲什麼要複製你的數據?該適配器永遠不會注意到data元素的更改,因爲它只在構建時與該元素的副本一起使用。如果需要複製data,則應確保適配器也更新其內容。

相關問題