刷新列表视图时的UI阻塞(如何解决?)

时间:2014-08-29 20:06:39

标签: android listview android-arrayadapter ui-thread

我有一个按钮。点击后,我刷新了一个清单。

我遇到了什么

state_pressed 颜色停留很长时间(意味着UI线程被阻止)
(注意:按钮背景的定义如state_pressed =" true"颜色变化)

问题

如何在不阻止用户界面的情况下单击按钮刷新列表?

我的代码

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

1 个答案:

答案 0 :(得分:0)

你的refreshList应该在ui线程上运行...并且新的Runnable应该与线程一起使用...如果你没有创建新的线程,你将使用Runnable作为一种匿名类...作为标准android这不是很好的做法...但是,如果这解决了你的问题,从技术上来说你的代码没有任何问题......