【问题标题】:How to use notifyDataSetChanged如何使用 notifyDataSetChanged
【发布时间】:2011-12-23 19:03:07
【问题描述】:

我的项目简化如下: 首先,我使用应用程序方法 Data.java 来保存数据。 它包含数据:

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

当点击按钮时,启动 BActivity 类。 在 BActivity 类中,代码如下:

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

AActivity 类 onResume() 如下:

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

但是为什么列表没有更新? 我确认数据已保存。

我的数据适配器:

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

【问题讨论】:

  • 我试试这个。BookmarkAdapter = new NASFilesAdapter(this, d); this.setListAdapter(BookmarkAdapter);它再次重置 listadapter 以显示列表。这样做有什么缺点吗?

标签: android


【解决方案1】:

将新数据直接添加到适配器而不是“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

【讨论】:

  • 如何直接向适配器添加新数据?
  • 为什么我不能使用aa.add方法?
  • 你在扩展什么样的适配器? Guess DataAdapter 是一个自定义适配器...
  • 我也尝试添加 Data d = (Data)this.getApplication();字符串测试 = 新字符串 [d.getsize()]; for(i = 0; i
  • 哦,好的,如果您使用的是基本适配器,则没有方法添加。当您使用基本适配器时,您决定哪种数据结构将保留您的数据,因此您始终需要对其进行修改。您还应该发布适配器代码...
【解决方案2】:

您不能将 notifyDataSetChanged 作为 静态 方法访问
(这就是您在示例中所做的)。

如果您有ListActivity:您可以访问方法getListAdapter()

这是对您的数据集的正确引用。

简而言之:

getListAdapter().notifyDataSetChanged();

会成功的。如果您没有 ListActivity,那么您必须通过 View.findViewById([id of listview]) 找到您的列表视图并在那里获取适配器。

希望这会有所帮助:-)

【讨论】:

    【解决方案3】:

    我认为您的问题是您的DataAdapter 引用了数组test,但test 永远不会改变。 data 引用到DataAdapter 而不是test 应该可以工作。

    好的,在查看Adapter 代码后,它将无法正常工作。你为什么要复制你的数据?适配器永远不会注意到data 元素的变化,因为它只在构造时使用该元素的副本。如果需要复制data,则应确保适配器也更新其内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多