java - 将 saveInstanceState 与 Uri ArrayList 和适配器一起使用

标签 java android bundle android-arrayadapter

我创建了一个 ListView ,用于将文件从 SD 卡上传到列表并将其附加到列表中。然而我退出了 Activity 并且 onDestroyed 被调用并且我从我的 listView 中丢失了所有数据。我正在使用 ArrayList FileUploaded 和适配器来上传文件,但我对如何在“onSavedInstanceState”方法上实现它感到困惑。

我已进行研究,但仍有一些问题。

我是否存放了错误的元素?

请帮助...任何建议。

我的变量:

ListView Added_Files;
Button Select_File;
Button Add_To_List;
Button Save_Button;
Button Add_To_DropBox;
TextView selectedFile;
MediaPlayer mediaPlayer;
ArrayList<Uri> FileUpload = new ArrayList<Uri>();
ArrayAdapter  adapter;

//单击“上传到列表”按钮时将文件添加到 ListView 的方法

 public void addList(){

    adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1,FileUpload);
    Add_To_List.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Added_Files.setAdapter(adapter);
            adapter.add(uri.getPath());
            ((BaseAdapter) Added_Files.getAdapter()).notifyDataSetChanged();
            selectedFile.setText("");
            Make_File_Empty();

           // Toast.makeText(AddFiles.this, "File Added", Toast.LENGTH_SHORT).show();
        }
    });

}

这里是选择sd卡上的文件并显示在屏幕上的方法

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case REQUEST_CODE:
            //If file selection was successfull
            if (resultCode == RESULT_OK) {
                if (data != null) {
                    //get uri of the selected file
                    uri = data.getData();

                    Log.i(TAG, "Uri = " + uri.toString());
                    try {
                        //get file path from Uri
                       // Toast.makeText(AddFiles.this, "File Selected: " + uri.getPath(), Toast.LENGTH_SHORT).show();
                        selectedFile.setText("Selected File: " + uri.getPath());

                        addList();

                    } catch (Exception e) {
                        Log.e("FileSelectorActivity", "File select error", e);
                    }
                    super.onActivityResult(requestCode, resultCode, data);
                }
            }
    }
}

最后,onSaved/restore 方法:

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    outState.putStringArrayList("key",FileUpload );
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    FileUpload = savedInstanceState.getStringArrayList("key");
}  

最佳答案

仔细看这篇文章:https://developer.android.com/guide/components/activities/activity-lifecycle#save-simple-lightweight-ui-state-using-onsaveinstancestate

onSaveInstanceState 中,您似乎在调用 super 后保存状态,这可能会导致数据无法保存。您可能还想保存和恢复 TextView 中的文本,以便在恢复 UI 时显示。

另一件需要注意的是这里所说的:注意:当用户明确关闭 Activity 时或在其他情况下调用 finish() 时,不会调用 onSaveInstanceState()。

保存状态只是为了在短期情况下保存数据(示例在调用 super 之前保存它),如果你想保存更长时间(在应用程序启动之间)你可能想要使用一个 SQLite 数据库,它有很多更复杂。

我不是这方面的专家,但希望这对您有所帮助!我建议在 onSaveInstanceStateonRestoreInstanceState 中设置断点,以查看在遇到问题时调用的内容。

关于java - 将 saveInstanceState 与 Uri ArrayList 和适配器一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51472866/

相关文章:

java - 为什么我的十进制转二进制程序会在末尾添加额外的数字?

java - Spring - 如何验证 DTO/POJO 中 byte[] 中元素的最小/最大值?

android - 如何在 Android 中自定义 SeekBar 的外观?

php - 以编程方式添加的 bundle 产品未显示在前端

java - 如何使 map 可点击以获得另一帧?

java - 如何使用 -add-modules 添加多个模块

java - 将 Bigdecimal 和 int 相乘产生错误

android - 如何更改 Android 中的微调器背景?

symfony - 是否可以在编译过程中添加自定义路由?

ruby-on-rails - 如何修复以下 bundle 程序错误?