2

我有一个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);
            }
        });

    }
}

无论我实例化mHandlerasnew Handler()还是 as new Handler(Looper.getMainLooper()),它都不起作用。

我的理解是,这new Handler(Looper.getMainLooper())将允许我在 UI 线程上执行任务,并且应该具有与runOnUiThread. 我的想法有什么问题?

更新

出于测试目的,我onDataAvailable从函数末尾调用onCreateView并加载了模拟数据。同样的效果:使用我自己的处理程序,它无法滚动。使用 runOnUiThread,它可以完美运行。

更有趣的是,我从 runnable 外部为处理程序和 runOnUiThread 打印了线程 ID。两次,代码都在线程 1 上运行,没有区别。

更新 2

如果我使用mRecyclerView.scrollToPosition而不是smoothScrollToPosition. 知道那可能是什么吗?

4

0 回答 0