listView更新不适用于静态变量

时间:2018-01-09 15:10:50

标签: java android listview runnable ui-thread

我有一个带有自定义适配器的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中的公共静态变量。有没有人知道为什么这不起作用?

布鲁诺

2 个答案:

答案 0 :(得分:2)

您无法从原始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));
            }
        });

    }
});

答案 1 :(得分:1)

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

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

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));
                        }
                    }