RecyclerView适配器在设备旋转后不更新视图

问题描述 投票:0回答:1

我有一个聊天应用程序,它将打开Websocket到服务器。该应用程序有2个模块-

  1. chat sdk:处理连接以及来回连接消息传递。
  2. ui:处理适配器和视图

聊天UI在活动主持的片段上。

一切正常,但是当我决定对设备旋转使用持久性时,我遇到了问题。当我旋转设备时,websocket重新连接(正常),活动也被重新创建,片段也被重新创建。

在设备旋转和进行一些调试之后,我看到我的messageList正确地填充了所有添加的项(即,消息文本),但没有UI。当我从EditText键入文本并按send时,该项目会正确显示在UI中,但是当我收到来自服务器的响应时,即使将消息添加到messageList,UI也不会更新。

我读过类似的文章,说RecyclerView适配器在旋转后正在更新旧片段。是这样吗如果是这种情况,为什么当我从EditText发送消息时,它可以正确显示,而从WebSocket的onMessage中发送时却不能显示?

我尝试"android:configChanges="screenSize|orientation|screenLayout"没有任何结果。我重写了onConfigurationChanged并强制适配器更新视图,但没有结果

@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {

    super.onConfigurationChanged(newConfig);

    if(messagesAdapter!=null){
        messagesAdapter.notifyDataSetChanged();
    }
}

我保存了片段以将其恢复到我的活动中

public class MessageActivity extends AppCompatActivity {
private MessageFragment fragment;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_message);


    if (savedInstanceState == null) {
        fragment = MessageFragment.newInstance();

        getSupportFragmentManager().beginTransaction()
                .replace(R.id.container, fragment)
                .commitNow();
    }else{
        fragment = (MessageFragment) getSupportFragmentManager().getFragment(savedInstanceState, "messageFragment");
    }

}

@Override
public void onBackPressed() {

    finishAffinity();
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    //Save the fragment's instance
    getSupportFragmentManager().putFragment(outState, "messageFragment", fragment);
}}

而且我还保存并检索我的messageList

 @Override
public void onSaveInstanceState(@NonNull Bundle outState) {

    super.onSaveInstanceState(outState);
    //saving the state of the chat
    outState.putParcelableArrayList("messages", messageArrayList);
    try {
        Log.d(TAG, "messagelist in save instance " + messageArrayList.size());
    }catch (NullPointerException e){
        e.printStackTrace();
    }
    outState.putString("dialogId", messageArrayList.get(0).getDialogId());
}
android android-recyclerview rotation fragment adapter
1个回答
0
投票

将此方法添加到Activity的onResume()中,并且如果需要调用数据

if(messagesAdapter!=null){
    messagesAdapter.notifyDataSetChanged();
}
© www.soinside.com 2019 - 2024. All rights reserved.