我有一个聊天应用程序,它将打开Websocket到服务器。该应用程序有2个模块-
聊天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());
}
将此方法添加到Activity的onResume()中,并且如果需要调用数据
if(messagesAdapter!=null){
messagesAdapter.notifyDataSetChanged();
}