【发布时间】:2014-08-29 20:06:39
【问题描述】:
我有一个按钮。点击后,我正在刷新一个列表。
我正在经历的事情:
state_pressed 颜色会停留很长时间(意味着 UI 线程被阻塞)
(注意:按钮背景定义如在 state_pressed="true" 上颜色变化)
问题:
如何在不阻塞 UI 的情况下单击按钮刷新列表?
我的代码:
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
refreshListView(data);
}
});
public void refreshListView(ArrayList data) {
// I am setting setNotifyOnChange() to false
// to prevent notifyDataSetChanged() to be triggered twice, by clear() and by addAll()
mArrayAdapter.setNotifyOnChange(false)
mArrayAdapter.clear();
mArrayAdapter.addAll(data);
// I am triggering notifyDataSetChanged() explicitely
mArrayAdapter.notifyDataSetChanged();
mListView.post(new Runnable() {
@Override
public void run() {
// this is to reset to the top of the list, after the list has been populated
mListView.setSelectionAfterHeaderView();
}
});
}
编辑:
我想我通过从 View.post() 调用刷新代码解决了这个问题,但我想知道这是否应该总是需要:
mButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mListView.post(new Runnable() {
@Override
public void run() {
refreshListView(data);
}
});
}
});
【问题讨论】:
-
看你的代码,我不认为问题区域在上面的代码中... mArrayAdapter 是标准适配器还是自定义的?如果是定制的,是否有一些可能需要更长时间的数据处理?过去我遇到过这个问题,我的适配器要从服务器抓取图像并显示...我必须把它放在 AsyncTask 上...
-
@AtulDravid-WhitePvt.Ltd.,它是一个自定义适配器,但它使用已处理的数据。我刚刚意识到我可以通过在
View.post()中调用refreshListView()来解决问题。这是一个好的解决方案吗?
标签: android listview android-arrayadapter ui-thread