Java 当已在底部且添加了新项目时,将recyclerView保留在底部

Java 当已在底部且添加了新项目时,将recyclerView保留在底部,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在创建一个聊天应用程序。当列表中当前最低的项目在屏幕上可见时,我试图使所有新消息显示在聊天应用程序的底部,但当用户向上滚动时(与大多数聊天应用程序一样),则不会显示。到目前为止,当屏幕上还有未使用的空间时,我已经让它工作了,但是当RecyclerView有太多视图无法容纳时,它开始将新消息放在屏幕外的底部。以下是我创建RecyclerView的方法: private void initRecyclerView() { mRecyclerView = findViewById(R.

我正在创建一个聊天应用程序。当列表中当前最低的项目在屏幕上可见时,我试图使所有新消息显示在聊天应用程序的底部,但当用户向上滚动时(与大多数聊天应用程序一样),则不会显示。到目前为止,当屏幕上还有未使用的空间时,我已经让它工作了,但是当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);

mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1)//删除此行

并使用以下命令:

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

mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()-1)//删除此行

并使用以下命令:

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

最后,我添加了一个检查,查看RecyclerView是否位于底部,并将该布尔值插入AdapterDataObserver。我还犯了一个错误,使用了observer的onChanged方法而不是OnItemLangeInserted,这显然是补充RecycleServiceAdapter中插入的NotifyItems所必需的

下面是我的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);
            } else {
            }
        }
    };

    //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);

}

最后,我添加了一个检查,查看RecyclerView是否位于底部,并将该布尔值插入AdapterDataObserver。我还犯了一个错误,使用了observer的onChanged方法而不是OnItemLangeInserted,这显然是补充RecycleServiceAdapter中插入的NotifyItems所必需的

下面是我的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);
            } else {
            }
        }
    };

    //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);

}

我假设“列表”应该是我的RecyclerView中的项目列表,它仍然只是从页面输入新项目。我遗漏了什么吗?您不想添加新项目吗?RecyclerView中的每个项目都包含一条消息,新消息显示在底部,带有linearLayoutManager.setStackFromEnd(true)。但是,当RecyclerView中有足够的项目填满屏幕时,我希望它自动向上滚动,将RecyclerView置于底部,并在屏幕上保留最新消息。我假设“列表”应该是我的RecyclerView中的项目列表,它仍然只是在页面上输入新项目。我遗漏了什么吗?您不想添加新项目吗?RecyclerView中的每个项目都包含一条消息,新消息显示在底部,带有linearLayoutManager.setStackFromEnd(true)。但是,当RecyclerView中有足够的项目填满屏幕时,我希望它自动向上滚动,将RecyclerView置于底部,并在屏幕上保留最新消息。