我正在使用一些代码来帮助我从名为 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");
}
});
我还在我的 Activity 中定义了这个处理程序,认为我可以调用它并且它会更新 ArrayAdapter,但我在这里遇到了相同的错误:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
WeightAdapter.notifyDataSetChanged();
}
};
最后,我在适配器定义中创建了一个方法来通知自身,但调用它给了我相同的静态/非静态错误:
public void updateMe() {
this.notifyDataSetChanged();
}
长话短说 - 有很多问题似乎与同一主题有关,并且有很多建议,但我在实现上一直不成功。谁能告诉我具体如何实现这个?
谢谢!
另一件事:我正在考虑从 Web 数据切换到 Azure SQL DB,但这也会使用回调,我想也有同样的问题?
最佳答案
您只能使用ClassName.methodName();
调用静态方法,但是,notifyDataSetChanged()
不是静态方法。即 notifyDataSetChanged()
的工作方式取决于适配器的实例。
为了确保其正常工作,您应该在自定义适配器的对象上使用 notifyDataSetChanged()
。
如果你有类似的东西:
DataAdapter customAdapter = new DataAdapter(//params);
listView.setAdapter(customAdapter);
您应该调用:
customAdapter.notifyDataSetChanged();
关于java - Android 无法更新 ArrayAdapter,因为 "Non-Static method ' notifyDataSetChanged( )' cannot be referenced from a static context",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924298/