java - 如何让RecyclerView在每次将项目添加到列表时不滚动到底部

标签 java android android-recyclerview

当我的聊天加载时,我希望我的 RecyclerView 滚动到底部,但是当用户手动向上滚动列表以阅读以前的消息时,它不应该在列表中添加新项目时再次向下滚动,除非消息(新项目)由用户自己发送/添加。

我尝试使用layoutManager.setStackFromEnd(true) 和recyclerView.scrollToPosition(list.size() - 1)。如果我手动向上滚动,这两种方法都会在收到新消息时自动向下滚动列表,除非我是发送消息的人,否则它不应再次向下滚动到底部。

mref.child(RoomName).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()) {
            ChatMessage value = dataSnapshot1.getValue(ChatMessage.class);
            ChatMessage fire = new ChatMessage();
            String msgtxt = value.getMessageText();
            String user=value.getMessageUser();
            long msgtime=value.getMessageTime();
            String  prothumb=value.getProfuri();
            String sentimguri=value.getSentimguri();
            String type=value.getType();

            fire.setMessageUser(user);
            fire.setMessageText(msgtxt);
            fire.setMessageTime(msgtime);
            fire.setProfuri(prothumb);
            fire.setSentimguri(sentimguri);
            fire.setType(type);
            list.add(fire);
        }
        adapter = new RecyclerViewAdapter(ChatRoom.this, list);
        recyclerView.setAdapter(adapter);

        //layoutManager.setStackFromEnd(true);
    }

    //Initializing RecyclerView
    private void initRecyclerView() {
        //Log.d(TAG, "initRecyclerView: init recyclerview.");
        recyclerView =(RecyclerView) findViewById(R.id.list_of_messages);
        recyclerView.setHasFixedSize(true);
        layoutManager=new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        //recyclerView.scrollToPosition(list.size() - 1);
    }
}

最佳答案

获取聊天列表后,您不必每次都创建新的适配器实例。而只需通知适配器有关更改即可。

mref.child(RoomName).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
       list.clear();
    for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()) {
        ChatMessage value = dataSnapshot1.getValue(ChatMessage.class);
        ChatMessage fire = new ChatMessage();
        String msgtxt = value.getMessageText();
        String user=value.getMessageUser();
        long msgtime=value.getMessageTime();
        String  prothumb=value.getProfuri();
        String sentimguri=value.getSentimguri();
        String type=value.getType();

        fire.setMessageUser(user);
        fire.setMessageText(msgtxt);
        fire.setMessageTime(msgtime);
        fire.setProfuri(prothumb);
        fire.setSentimguri(sentimguri);
        fire.setType(type);
        list.add(fire);
    }

  if(!(recyclerView.canScrollVertically(1)))
            {
            recyclerView.smoothScrollToPosition(adapter.getItemCount());
            }

    adapter.notifyDataSetChanged();
    //layoutManager.setStackFromEnd(true);
}

//Initializing RecyclerView
private void initRecyclerView() {
    //Log.d(TAG, "initRecyclerView: init recyclerview.");
    recyclerView =(RecyclerView) findViewById(R.id.list_of_messages);
    recyclerView.setHasFixedSize(true);
    layoutManager=new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    //initialse your adapter only once 
    adapter = new RecyclerViewAdapter(ChatRoom.this, list);        
    recyclerView.setAdapter(adapter);
    layoutManager.setStackFromEnd(true);

    //recyclerView.scrollToPosition(list.size() - 1);
}

}

这可能会解决您的问题。

关于java - 如何让RecyclerView在每次将项目添加到列表时不滚动到底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57926037/

相关文章:

android - Android中显示细节的最有效方式

java - 数据拼接连接/合并 - Oracle 与基于 Java 的技术

java - android 事件监听器中的相对布局问题 : one child's listener is getting applied to all children

java - 如何在TextArea中创建粗体打印?

Android usb主机通信

java - 单击查看时从服务器检索数据

android-recyclerview - 如何将该Firebase Recycler Adapter实现转换为Adapter.kt类?

java - 设置使用热敏打印机打印 JFrame 内容

android - 从 Google Drive 下载文件的问题

java - 用于 C++ 和 Java 的 Diffie-Hellman 库