我有一个简单的消息布局,Evertime 任何人都可以在其中打开 Activity,然后回收站视图应始终显示位于屏幕底部的最新数据。
<块引用>所以,我发现这段代码可以做到这一点:
comment_recycler = (RecyclerView) findViewById(R.id.comment_recycler);
comment_recycler.smoothScrollToPosition(comment_recycler.getAdapter().getItemCount() - 1);
<块引用>
但是,每次发生此错误时:
java.lang.IllegalArgumentException: Invalid target position
<块引用>
这是完整的代码:
databaseReference1 = FirebaseDatabase.getInstance().getReference("Blogs").child("Comments");
options = new FirebaseRecyclerOptions.Builder<CommentModel>()
.setQuery(databaseReference1, CommentModel.class)
.build();
comment_recycler.setLayoutManager(new LinearLayoutManager(this));
commentAdapter = new CommentAdapter(options, CommentsActivity.this);
comment_recycler.setAdapter(commentAdapter);
comment_recycler.smoothScrollToPosition(comment_recycler.getAdapter().getItemCount() - 1);
commentAdapter.notifyDataSetChanged();
@Override
protected void onStart() {
super.onStart();
commentAdapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
commentAdapter.stopListening();
}
<块引用>
如何修复此错误。请指导。谢谢
答案 0 :(得分:1)
我想数据是使用异步调用从远程获取的,因此初始 smoothScrollPosition
将是 -1
,因为 comment_recycler.getAdapter().getItemCount()
将是 zero
,直到数据被获取,请在获取数据并通知 recycler
后移动该行。
答案 1 :(得分:1)
在 recyclerview 数据完全加载时尝试 smoothScrollPosition
方法。
所以
comment_recycler.postDelayed(new Runnable() {
@Override
public void run() {
comment_recycler.smoothScrollToPosition(comment_recycler.getAdapter().getItemCount() - 1);
}
},500);
500 不是测量值,但在大多数情况下是有效的。