gpt4 book ai didi

java - 当已位于底部并添加新项目时,将 recyclerView 保留在底部

转载 作者:行者123 更新时间:2023-12-01 16:45:32 25 4
gpt4 key购买 nike

我正在创建一个聊天应用程序。当列表中当前最低的项目在屏幕上可见时,我试图使所有新消息显示在聊天应用程序的底部,但当用户向上滚动时则不会(像大多数聊天应用程序一样)。截至目前,当屏幕上仍有未使用的空间时,我已经让它发挥作用,但是当 RecyclerView 有太多 View 无法容纳时,它开始将新消息放置在屏幕之外的底部。这是我创建 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);

最佳答案

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

这是我的 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);

}

关于java - 当已位于底部并添加新项目时,将 recyclerView 保留在底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52193374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com