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