我有一个应用程序,应该保留所有的数据显示到回收器时,屏幕被旋转。回收器从自定义数组列表接收数据。还有第二个变量用于设置适配器内部的VideoView的Uri。
我已经尝试过onSave和onRestoreIntance了。也许我用错了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Variables-----------------------------------------
recyclerView = findViewById(R.id.recyclerView);
Button video = findViewById(R.id.video);
Button camera = findViewById(R.id.camera);
Button send = findViewById(R.id.send);
final EditText editText = findViewById(R.id.editText);
// Layout Manager------------------------------------------------
linearLayoutManager = new LinearLayoutManager(MainActivity.this);
linearLayoutManager.setStackFromEnd(true);
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setItemAnimator(itemAnimator);
// Adapter-----------------------------------------
//adapter.notifyDataSetChanged();
adapter = new myAdapter(dati, this);
recyclerView.setAdapter(adapter);
// Click Listener Video button----------------------------------------
video.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
startActivityForResult(intent,0);
}
});
// Click Listener Camera button--------------------------------------
camera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent,1);
}
});
// Click Listener Send button-----------------------------------------
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String string = editText.getText().toString();
dati.add(new ModelloDati(0,string));
adapter.notifyItemInserted(dati.size());
editText.getText().clear();
recyclerView.smoothScrollToPosition(dati.size());
closeKeyboard();
}
});
if(savedInstanceState != null)
linearLayoutManager.onRestoreInstanceState(
savedInstanceState.getParcelable("STATO_LISTA"));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode){
case 0:
try {
Uri contentURI = data.getData();
passUri = contentURI;
String recordedVideoPath = getPath(contentURI);
saveVideoToInternalStorage(recordedVideoPath);
dati.add(new ModelloDati(2, contentURI));
adapter.notifyItemInserted(dati.size());
recyclerView.smoothScrollToPosition(dati.size());
}catch (Throwable o){Log.i("CAM","User aborted action");}
case 1:
try {
Bitmap bitmap = (Bitmap)data.getExtras().get("data");
dati.add(new ModelloDati(1,bitmap));
adapter.notifyItemInserted(dati.size());
recyclerView.smoothScrollToPosition(dati.size());
}catch(Throwable o){
Log.i("CAM","User aborted action");
}
}
}
@Override
protected void onResume() {
super.onResume();
if (saveList != null) {
linearLayoutManager.onRestoreInstanceState(saveList);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
saveList = linearLayoutManager.onSaveInstanceState();
outState.putParcelable("STATO_LISTA",saveList);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if(savedInstanceState != null)
savedInstanceState.getParcelable("STATO_LISTA");
}
}
发布于 2019-05-28 00:49:15
安卓提供了Architecture components,它可以帮助你处理这些情况。例如ViewModel
Android框架管理UI控制器的生命周期,例如活动和片段。框架可能会决定销毁或重新创建UI控制器,以响应某些完全不受您控制的用户操作或设备事件。
如果系统销毁或重新创建UI控制器,则存储在其中的所有与UI相关的临时数据都将丢失。例如,您的应用程序可能会在其中一个活动中包含一个用户列表。当为配置更改重新创建活动时,新活动必须重新获取用户列表。对于简单的数据,该活动可以使用onSaveInstanceState()方法并从onCreate()中的包中恢复其数据,但这种方法只适用于可以序列化然后反序列化的少量数据,而不适用于潜在的大量数据,如用户列表或位图。
因此,基本上可以在ViewModel和onCreate
中保存适配器的数据集,获取数据并将其设置到适配器中。
MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
new adapter(model.getData(),this); // just for the example.
https://stackoverflow.com/questions/56328714
复制相似问题