Как использовать метод onSaveInstance с Recyclerview - PullRequest
0 голосов
/ 27 мая 2019

У меня есть приложение, которое должно сохранять все данные, отображаемые в Recycler, при повороте экрана.переработчик получает данные из списка пользовательских массивов.есть также вторая переменная, используемая для установки Uri VideoView внутри адаптера.

уже пробовал 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");
}

}

1 Ответ

0 голосов
/ 27 мая 2019

Android предлагает Компоненты архитектуры , которые помогут вам справиться с подобными ситуациями. Например ViewModel

Платформа Android управляет жизненными циклами контроллеров пользовательского интерфейса, такими как действия и фрагменты. Платформа может решить уничтожить или заново создать контроллер пользовательского интерфейса в ответ на определенные действия пользователя или события устройства, которые полностью находятся вне вашего контроля.

Если система уничтожает или воссоздает контроллер пользовательского интерфейса, все временные данные, связанные с пользовательским интерфейсом, которые вы сохраняете в них, теряются. Например, ваше приложение может включать список пользователей в одном из своих действий. Когда действие повторно создается для изменения конфигурации, новое действие должно повторно выбрать список пользователей. Для простых данных действие может использовать метод onSaveInstanceState () и восстанавливать его данные из пакета в onCreate (), но этот подход подходит только для небольших объемов данных, которые можно сериализовать, а затем десериализовать, а не для потенциально больших объемов данных. как список пользователей или растровые изображения.

Таким образом, вы можете хранить свой набор данных для своего адаптера в ViewModel, а внутри onCreate получить данные и установить их в свой адаптер.

MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class);
new adapter(model.getData(),this); // just for the example.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...