我的Fragment
包含RecyclerView
。在Fragment
中,我从数据库加载一些数据,用{}填充RecyclerView
,然后想要滚动到RecyclerView
中的某个位置。
要在加载数据后在UI线程上执行滚动,我想使用处理程序:
public class MyFragment extends Fragment {
private RecyclerView mRecyclerView;
private mHandler Handler = new Handler();
//....
private void onDataAvailable() {
// ...
int scrollPosition = getScrollPosition();
mHandler.post(new Runnable() {
public void run() {
mRecyclerView.smoothScrollToPosition(scrollPosition);
}
});
}
}
然而,它永远不会向下滚动。
当我使用runOnUiThread
时,一切正常:
public class MyFragment extends Fragment {
private RecyclerView mRecyclerView;
//....
private void onDataAvailable() {
// ...
int scrollPosition = getScrollPosition();
getActivity().runOnUiThread(new Runnable() {
public void run() {
mRecyclerView.smoothScrollToPosition(scrollPosition);
}
});
}
}
无论我将mHandler
实例化为new Handler()
还是new Handler(Looper.getMainLooper())
,它都无法正常工作。
我的理解是new Handler(Looper.getMainLooper())
允许我在UI线程上执行任务,并且应该与runOnUiThread
具有相同的效果。我的想法有什么不对?
更新
出于测试目的,我从onDataAvailable
函数的末尾调用onCreateView
并加载了模拟数据。相同的效果:使用我自己的处理程序,它无法滚动。使用runOnUiThread,它可以很好地工作。
更有趣的是,我从runnable外部为handler和runOnUiThread打印了线程ID。两次,代码都在线程1上运行,没有区别。
更新2
如果我使用mRecyclerView.scrollToPosition
而不是smoothScrollToPosition
,那么一切正常。知道那可能是什么吗?