【问题标题】:Android Cannot update ArrayAdapter because "Non-Static method 'notifyDataSetChanged()' cannot be referenced from a static context"Android 无法更新 ArrayAdapter,因为“无法从静态上下文引用非静态方法 'notifyDataSetChanged()'”
【发布时间】: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


【解决方案1】:

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

为确保此方法有效,您应该在自定义适配器的对象上使用notifyDataSetChanged()

如果你有类似的东西:

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

你应该打电话:

customAdapter.notifyDataSetChanged(); 

【讨论】:

  • smh。我把类和实例混在一起了。你是对的 - 我在适配器类而不是我创建的实例上调用 notifyDataSetChanged。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2013-08-05
相关资源
最近更新 更多