我正在使用recyclerview,我必须在recyclerview中选择最后一项。
我首先滚动到recyclerview,然后对所选项目调用performClick()方法。
这是代码。
int latestPostIndex = reactionsListAdapter.getItemCount() - 1;
rvReactionsList.scrollToPosition(latestPostIndex);
rvReactionsList.getChildAt(latestPostIndex).performClick();
latestPostIndex已正确填充。问题是在滚动完成之前调用performClick,因此应用程序崩溃。
如何使performClick()等到scrollToPosition()完成?
答案 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();