【问题标题】:RecyclerView scroll in incorrect direction when new element is inserted插入新元素时,RecyclerView 滚动方向不正确
【发布时间】:2017-01-18 13:46:56
【问题描述】:

我使用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);
        }
    };

【问题讨论】:

  • 我更新了我的答案。看看如果它没有帮助发表评论。

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


【解决方案1】:

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

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

linearLayoutManager.scrollToPositionWithOffset(position,offset);

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

linearLayoutManager.scrollToPosition(position);

【讨论】:

  • 起初,我认为 list_chat.post 是插入新元素时的事件。但正如我刚刚测试的那样,它没有。所以现在我的问题是“在哪里拉更新 linearLayoutManager.scrollToPosition(position); ?”
  • 在什么情况下可以调用滚动线?我可以把里面的发送按钮;但这只更新来自我的新消息。别人发消息时如何获取事件?
  • 一直滚动到顶部的原因是因为linearLayoutManager.setStackFromEnd(true);评论它保持屏幕保持位置。但是,在哪里调用更新滚动? list_chat.smoothScrollToPosition(adapter.getItemCount());确实适用于特殊测试。所以我不认为 linearLayoutManager.scrollToPosition(position);就是答案。
  • 如果你想滚动你的recycleView 那就是答案。现在您的第二个问题已经超出了您当前的问题主题。我对 Firebase 数据库一无所知,所以我无法帮助你兄弟。
  • 感谢您的帮助。但正如我所指出的,从 RecyclerView 或 LinearLayoutManager 设置滚动是相同的(实际上我还没有使用 LinearLayoutManager 进行测试)。因此,您的答案实际上并没有回答问题。相反,答案是在哪里放置滚动代码。
【解决方案2】:

好的。我找到了答案。 首先,我的问题的老问题:我认为每当插入一个项目时都会调用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());
        }
    });

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多