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

时间:2018-07-23 06:37:05

标签: java android bundle android-arrayadapter

我创建了一个列表视图,该列表视图将SD卡中的文件上传到列表并将其附加到列表中。但是我退出了活动,并且调用了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");
}  

1 个答案:

答案 0 :(得分:1)

请仔细阅读本文:https://developer.android.com/guide/components/activities/activity-lifecycle#save-simple-lightweight-ui-state-using-onsaveinstancestate

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

要注意的另一件事是它在这里所说的:Note: onSaveInstanceState() is not called when the user explicitly closes the activity or in other cases when finish()is called.

保存状态仅用于在短期情况下保存数据(本示例在调用super之前保存数据),如果要保存更长的时间(在应用启动之间),则可能需要使用大量的SQLite数据库更复杂。

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