插入新元素时,RecyclerView向错误的方向滚动

时间:2017-01-18 13:46:57

标签: android android-recyclerview firebase-realtime-database smooth-scrolling firebaseui

我使用smoothScrollToPosition滚动RecyclerView。每次插入新条目时都会滚动;但是到了顶部,而不是到底部,这是我想要的方向。

    list_chat = (RecyclerView) findViewById(R.id.list_chat);
    //Set up Layout Manager
    linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setStackFromEnd(true);
    list_chat.setLayoutManager(linearLayoutManager);
    //set adapter
    list_chat.setAdapter(adapter);
    //set scroll
    list_chat.post(new Runnable() {
        @Override
        public void run() {
            list_chat.smoothScrollToPosition(adapter.getItemCount());
        }
    });

适配器来自Firebase

adapter = new FirebaseRecyclerAdapter<ChatItem, ChatRecylerViewHolder>(ChatItem.class,R.layout.chat_item
        ,ChatRecylerViewHolder.class,queryChat  ) {
        @Override
        protected void populateViewHolder(ChatRecylerViewHolder viewHolder, ChatItem model, int position) {
            viewHolder.tvAuthorChat.setText(model.chatAuthor);
            viewHolder.tvContentChat.setText(model.chatContent);
        }
    };

2 个答案:

答案 0 :(得分:2)

您确实注意到您正在使用linearLayoutManager.setStackFromEnd(true);这意味着您的第一个位置位于底部。我建议你选择一个更好的选择。

RecycleView没有像listView那样工作,你可以用你的布局管理器滚动它

linearLayoutManager.scrollToPositionWithOffset(position,offset);

您要滚动到的位置是哪个位置,offset是当前位置的偏移量。您也可以使用一个参数。

linearLayoutManager.scrollToPosition(position);

答案 1 :(得分:0)

确定。我找到了答案。 首先,问题的老问题:我认为只要插入一个项目就会调用list_chat.post(结果是错误的)。它保持滚动顶部的原因是linearLayoutManager.setStackFromEnd(true); 因此,问题归结为在哪里调用滚动? 答案是:由于适配器管理数据,因此猜测适配器将通知插入是有意义的。 这是代码

adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            list_chat.smoothScrollToPosition(adapter.getItemCount());
        }
    });