繁体   English   中英

每次将项目添加到列表时如何使RecyclerView不会滚动到底部

[英]How to make RecyclerView not scroll to the bottom each time an item is added to the list

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

我已经尝试同时使用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);
    }
}

我看到的问题是,每次数据更改时,您都在创建适配器的新实例。 这就解释了为什么它总是向下滚动到底部。 这不是使用recyclerView的正确方法。

您需要做的是使用空列表在initRecyclerView期间仅创建一个适配器实例。 然后,每当数据更改时,更新现有列表,然后调用adapter.notifyDataSetChanged()。 这将为您提供所需的行为。

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

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

}

这可能会解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM