【发布时间】:2014-07-24 02:47:26
【问题描述】:
我正在使用一些代码来帮助我从名为 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");
}
});
我还在我的活动中定义了这个处理程序,认为我可以调用它并且它会更新 ArrayAdapter,但我在这里遇到了同样的错误:
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
WeightAdapter.notifyDataSetChanged();
}
};
最后我在适配器定义中创建了一个方法来通知自己,但调用它给了我同样的静态/非静态错误:
public void updateMe() {
this.notifyDataSetChanged();
}
长话短说 - 似乎有很多关于同一主题的问题和很多建议,但我没有成功实施。谁能告诉我我将如何实现它?
谢谢!
另外一件事:我正在考虑从 Web 数据切换到 Azure SQL DB,但那也会使用回调,我想也有同样的问题?
【问题讨论】:
-
你读过this question/answer,明白什么是静态引用了吗?
-
我没有专门读过那个。我想我明白这里的静态意味着什么。或者至少我认为 notifyDataSetChanged 是非静态的,因为它属于 ArrayAdapter 的特定实现(在我的示例中为 DataAdapter)。我不明白为什么这里的上下文被认为是静态的,或者我有一个非静态的上下文来调用这个方法。
标签: java android asynchronous static android-arrayadapter