【问题标题】:listView update doesn't work with static variablelistView 更新不适用于静态变量
【发布时间】:2018-01-09 15:10:50
【问题描述】:

我有一个带有自定义适配器的 ListView。我想更新 ListView 的数据。为此,我在适配器中编写了这个函数:

public void addData(Offer newOffer){
    this.offerList.clear();
    this.offerList.add(newOffer);
    this.notifyDataSetChanged();
}

我现在的问题是,当我想在 UI 线程之外使用以下函数调用此函数时,它不位于 OffersActivity 内部,它不起作用:

@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    final String message = new String(body, "UTF-8");

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            OffersActivity.offerAdapter.addData(new Offer("test", message));
        }
    });
}

适配器是 OffersActivity 中的一个公共静态变量。有人知道为什么这不起作用吗?

布鲁诺

【问题讨论】:

    标签: java android listview runnable ui-thread


    【解决方案1】:

    您不能从原始 UI 线程以外的任何线程运行 notifyDataSetChanged()。这样做

    new Handler(Looper.getMainLooper()).post(new Runnable() {
        @Override
        public void run() {
            this.runOnUiThread(new Runnable() {
    
                @Override
                public void run() {
                    OffersActivity.offerAdapter.addData(new Offer("test", message));
                }
            });
    
        }
    });
    

    【讨论】:

    • 看来你比我快。 ^^
    • 哈哈只有几秒钟:)
    • 问题是函数handleDelivery在另一个类里面...
    • 有没有可以使用的回调? handleDelivery 函数的一部分是什么?
    • 但是你首先需要 Handler 什么呢?如果您需要在后台处理某些内容并返回结果,为什么不使用 AsyncTask 。在我看来更容易处理,因为onPostExecute 直接在 UI 线程上运行?
    【解决方案2】:

    首先,您的方法应命名为 updateData 而不是 addData,因为它不会添加任何内容,只会用新数据替换旧数据。

    然后尝试(假设您的 handleDelivery 方法在您的 Activity 中):

    new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                 runOnUiThread(new Runnable() {
    
                            @Override
                            public void run() {
                               // NON static variable
                               OffersActivity.this.offerAdapter.addData(new Offer("test", message));
                            }
                        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2013-12-17
      • 2015-11-27
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多