Android无法更新ArrayAdapter,因为无法从静态上下文引用“非静态方法'notifyDataSetChanged()'”

时间:2014-07-24 02:47:26

标签: java android asynchronous static android-arrayadapter

我正在使用一些代码来帮助我从网络中提取名为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数据库,但这也会使用回调,我认为有相同的问题?

1 个答案:

答案 0 :(得分:3)

您只能使用ClassName.methodName();调用静态方法但是,notifyDataSetChanged()不是静态方法。 ie notifyDataSetChanged()的工作原理取决于适配器的实例。

为了确保这一点,您应该在自定义适配器的对象上使用notifyDataSetChanged()

如果你有类似的话:

DataAdapter customAdapter = new DataAdapter(//params);
listView.setAdapter(customAdapter);

你应该致电:

customAdapter.notifyDataSetChanged();