我有一个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
asnew Handler()
还是 as new Handler(Looper.getMainLooper())
,它都不起作用。
我的理解是,这new Handler(Looper.getMainLooper())
将允许我在 UI 线程上执行任务,并且应该具有与runOnUiThread
. 我的想法有什么问题?
更新
出于测试目的,我onDataAvailable
从函数末尾调用onCreateView
并加载了模拟数据。同样的效果:使用我自己的处理程序,它无法滚动。使用 runOnUiThread,它可以完美运行。
更有趣的是,我从 runnable 外部为处理程序和 runOnUiThread 打印了线程 ID。两次,代码都在线程 1 上运行,没有区别。
更新 2
如果我使用mRecyclerView.scrollToPosition
而不是smoothScrollToPosition
. 知道那可能是什么吗?