listview没有使用notifydatasetchanged()调用进行更新

时间:2012-03-17 05:30:48

标签: android listview android-arrayadapter

这是我的代码

listview =(ListView) findViewById(R.id.lv1);


    ArrayList<SClass> Monday = new ArrayList<SClass>();

    SClass s1=new SClass();
    s1.sName="samp";
    s1.salary=1000;
    Monday.add(s1);
    temp=Monday;
    adapter = new CustomAdap(this, temp);
    listview.setAdapter(adapter);

上面的代码工作正常。但是当我将代码更改为此

    listview =(ListView) findViewById(R.id.lv1);


    adapter = new CustomAdap(this, temp);

    SClass s1=new SClass();
    s1.sName="samp";
    s1.salary=1000;
    Monday.add(s1);
    temp=Monday;

    listview.setAdapter(adapter);
    adapter.notifyDataSetChanged();

Listview没有显示任何内容。问题是什么?

4 个答案:

答案 0 :(得分:17)

看起来您正在更改初始化适配器的集合。我会以这种方式更改您的代码:

// initial setup
listview =(ListView) findViewById(R.id.lv1);
ArrayList<SClass> Monday = new ArrayList<SClass>();
adapter = new CustomAdap(this, Monday);
listview.setAdapter(adapter);

// change your model Monday here, since it is what the adapter is observing
SClass s1=new SubjectClass();
s1.sName="samp";
s1.salary=1000;
Monday.add(s1);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

请注意,如果您的CustomAdap是ArrayAdapter的子类,您也可以完成

// change your array adapter here
SClass s1=new SubjectClass();
s1.sName="samp";
s1.salary=1000;
adapter.add(s1);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

编辑:感谢您的评论,我现在更了解您想要做的事情。您可能希望让适配器将其内容替换为您的不同ArrayLists。我会让你的CustomAdap成为ArrayAdapter的子类。

然后你可以这样使用它:

// replace the array adapters contents with the ArrayList corresponding to the day
adapter.clear();
adapter.addAll(MONDAY);

// notify the list that the underlying model has changed
adapter.notifyDataSetChanged();

答案 1 :(得分:5)

  

为什么它在第一个代码中有效?

---因为您要将值设置为temp列表并将其传递给adapter并将其显示为listview

  

为什么不在第二个代码中工作?

---因为您在将值设置为temp 之前将 temp设置为适配器     第二,当您将新值设置为temp时,您的适配器类可能无法获取更新的值。因为 temp不是公共的或不是类级别的,或者不是静态的。 将temp声明放在root级别并尝试。

如果您收到任何警告,请尽快显示您的完整代码和Logcat。

答案 2 :(得分:4)

在正确的xml文件中检查引用视图的链接。或至少检查是否存在所述xml文件。

答案 3 :(得分:3)

您使用的适配器是什么?很明显,在temp变量中设置数据后,适配器没有得到更新。