2011-12-23 23 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,则应确保适配器也更新其内容。

相关问题