java - Android 无法更新 ArrayAdapter,因为 "Non-Static method ' notifyDataSetChanged( )' cannot be referenced from a static context"

标签 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");
        }
    });

我还在我的 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/

相关文章:

java - 将具体集合类型转换到其接口(interface)的性能成本

java - List<T> 不等于 List<T>?

android - 从某一帧开始循环 Lottie 动画

android - 不可能 : No layout manager attached; Skipping layout

android - 删除的 Espresso 测试仍在运行

javascript - 推迟 Trip Advisor 脚本

java - 不变性和重新排序

java - Spring REST 中的 SSE 实现

javascript - 具有间隔函数的 async.eachSeries

javascript - 如何让 .each() 等待每次迭代完成