【问题标题】:Keep recyclerView at bottom when already at bottom and new item is added当已经在底部并添加新项目时,将 recyclerView 保持在底部
【发布时间】:2021-07-14 02:14:45
【问题描述】:

我正在创建一个聊天应用程序。当列表中的当前最低项目在屏幕上可见时,我试图让所有新消息出现在聊天应用程序的底部,但当用户向上滚动时(就像大多数聊天应用程序一样)。截至目前,当屏幕上仍有未使用的空间时,我已经让它工作了,但是当 RecyclerView 有太多视图无法容纳时,它开始将新消息从屏幕放置到底部。这是我创建 RecyclerView 的方法:

private void initRecyclerView() {


    mRecyclerView = findViewById(R.id.chatRecyclerView);
    mAdapter = new ChatRecyclerViewAdapter(this, mMessages, mUsernames, mRoomID, mDatabaseReference);
    mRecyclerView.setAdapter(mAdapter);
    final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setStackFromEnd(true);
    RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();

            if(linearLayoutManager.findLastVisibleItemPosition()==(mAdapter.getItemCount()-1)){
                mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1);
            }
        }
    };
    mAdapter.registerAdapterDataObserver(observer);
    mRecyclerView.setLayoutManager(linearLayoutManager);

【问题讨论】:

    标签: java android android-recyclerview


    【解决方案1】:

    我最终添加了一个检查以查看 RecyclerView 是否位于底部,并将该布尔值插入 AdapterDataObserver。我也犯了一个错误,使用观察者的 onChanged 方法而不是 onItemRangeInserted,这显然是补充 RecyclerViewAdapter 中的 notifyItemInserted 所必需的。

    这是我的 RecyclerView 的工作代码,如果用户位于底部,它会自动将新消息放置在底部:

     private void initRecyclerView() {
        
    
        //initializes and sets adapter 
        
    
        mRecyclerView = findViewById(R.id.chatRecyclerView);
        mAdapter = new ChatRecyclerViewAdapter(this, mMessages, mUsernames, mRoomID, mDatabaseReference);
        mRecyclerView.setAdapter(mAdapter);
    
        //Creates layout manager and makes it feed new RecyclerView views from the bottom
    
    
        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setStackFromEnd(true);
    
        //Makes RecyclerView scroll to bottom when notifyItemInserted is called from adapter and RecyclerView is already at bottom
    
        RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() {
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                super.onItemRangeInserted(positionStart, itemCount);
    
    
                if (isAtBottom) {
                    mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount() - 1);
                } 
            }
        };
    
        //Adds logic to see if RecyclerView is at bottom or not
    
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
    
                if (!recyclerView.canScrollVertically(1)) {
                    isAtBottom = true;
                } else {
                    isAtBottom = false;
                }
            }
        });
    
        //Assigns observer to adapter and LayoutManager to RecyclerView
    
        mAdapter.registerAdapterDataObserver(observer);
        mRecyclerView.setLayoutManager(linearLayoutManager);
    
    }
    

    【讨论】:

      【解决方案2】:

      mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1); // 删除这一行。

      并使用它:

      mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1);
      

      【讨论】:

      • 我认为“列表”应该是我的 RecyclerView 中的项目列表,它仍然只是在页面之外输入新项目。我错过了什么吗?
      • 您不想添加新项目?
      • RecyclerView 中的每一项都持有一条消息,新消息出现在底部,带有linearLayoutManager.setStackFromEnd(true)。但是,当 RecyclerView 中有足够的项目填满屏幕时,我希望它自动向上滚动并将 RecyclerView 带到底部并在屏幕上保留最新消息。
      猜你喜欢
      • 2021-06-04
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-12
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多