我正在使用一些代码来帮助我从网络中提取名为WebRequest(https://github.com/delight-im/Android-WebRequest)的数据。它提供了一个用于检索异步数据的回调。但是我无法更新我的ArrayAdapter,因为我收到错误“非静态方法'notifyDataSetChanged()'无法从静态上下文引用”
现在,我在这里看到了许多类似的问题。有人建议将notifyDataSetChanged命令放在Adapter类本身中。有人建议使用Handler,有些人建议使用Loader。但是我实际上没有运气实施这些解决方案。这是我的代码:
new WebRequest().get().to(stringSQLUrl).executeAsync(new WebRequest.Callback() {
public void onSuccess(int responseCode, String responseText) {
try {
DataHistory = CsvUtil.fromCsvTable(responseText);
DataHistory.remove(0); //Removes header row
} catch (Exception e) {
Log.e("Main pullWebData","Error converting from CsvTable: " + e.getMessage());
}
DataAdapter.notifyDataSetChanged(); // <-- ERROR HERE
runOnUiThread(new Runnable() {
@Override
public void run() {
DataAdapter.notifyDataSetChanged(); // <-- ALSO ERROR HERE
}
});
}
public void onError() {
Log.e("Main pullWebData","Error pulling data from web");
}
});
我也在我的活动中定义了这个Handler,我认为我可以调用它,它会更新ArrayAdapter,但我在这里得到了同样的错误:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
WeightAdapter.notifyDataSetChanged();
}
};
最后,我在Adapter定义中创建了一个方法来通知自己,但调用它给了我相同的静态/非staic错误:
public void updateMe() {
this.notifyDataSetChanged();
}
长话短说 - 关于同一主题和许多建议似乎有很多问题,但我在实施方面都没有成功。任何人都可以告诉我我是如何实现这个的吗?
谢谢!
另一件事:我正在考虑从Web数据切换到Azure SQL数据库,但这也会使用回调,我认为有相同的问题?
答案 0 :(得分:3)
您只能使用ClassName.methodName();
调用静态方法但是,notifyDataSetChanged()
不是静态方法。 ie notifyDataSetChanged()
的工作原理取决于适配器的实例。
为了确保这一点,您应该在自定义适配器的对象上使用notifyDataSetChanged()
。
如果你有类似的话:
DataAdapter customAdapter = new DataAdapter(//params);
listView.setAdapter(customAdapter);
你应该致电:
customAdapter.notifyDataSetChanged();