等到recyclerview滚动到位置

时间:2018-04-23 10:28:05

标签: android android-recyclerview

我正在使用recyclerview,我必须在recyclerview中选择最后一项。

我首先滚动到recyclerview,然后对所选项目调用performClick()方法。

这是代码。

int latestPostIndex = reactionsListAdapter.getItemCount() - 1;
rvReactionsList.scrollToPosition(latestPostIndex);
rvReactionsList.getChildAt(latestPostIndex).performClick();

latestPostIndex已正确填充。问题是在滚动完成之前调用performClick,因此应用程序崩溃。

如何使performClick()等到scrollToPosition()完​​成?

2 个答案:

答案 0 :(得分:3)

您可以为RecyclerView.OnScrollListener分配RecyclerView并收听onScrollStateChanged等待滚动完成:

int latestPostIndex = reactionsListAdapter.getItemCount() - 1;
rvReactionsList.scrollToPosition(latestPostIndex);
rvReactionsList.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if(newState == RecyclerView.SCROLL_STATE_IDLE 
            && linearLayoutManager.findLastVisibleItemPosition() == latestPostIndex)
            linearLayoutManager.findViewByPosition(latestPostIndex).performClick();

    }
});
P.S:别忘了更换 rvReactionsList.getChildAt(latestPostIndex) linearLayoutManager.findViewByPosition(latestPostIndex) getChildAt RecyclerView并不会返回row的最后一个单元格。

答案 1 :(得分:1)

选择的答案有问题。有时它滚动有时它没有。

我不理解的是smoothScrollToPosition(index)或scrollToPosition(index)聚焦/选择带有传递索引的项目。

答案中的解决方法是一种低效的处理方式,因为当用户不滚动列表时,它会不断检查布尔表达式。

我需要做的就是在smoothScrollToPosition之后调用notifyDatasetChanged()并设置一个名为currentReactionPos的索引(在onBindView()方法中使用)。

这是有效的代码。

// Select latest item after items added from server
                final int latestPostIndex = reactionsListAdapter.getItemCount() - 1;
                currentReactionPos = latestPostIndex;
                rvReactionsList.smoothScrollToPosition(latestPostIndex);
                rvReactionsList.getAdapter().notifyDataSetChanged();