Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android应用程序在内部存储器中以片段形式保存/加载_Java_Android_Android Studio_Android Fragments_Persistence - Fatal编程技术网

Java Android应用程序在内部存储器中以片段形式保存/加载

Java Android应用程序在内部存储器中以片段形式保存/加载,java,android,android-studio,android-fragments,persistence,Java,Android,Android Studio,Android Fragments,Persistence,我正在开发一个简单的笔记应用程序来学习android,但我被困在fragment的内部存储中保存/加载。该片段基本上是一个带有数组适配器的列表视图。当我在EditText中键入内容并单击按钮时,它会将这些注释添加到列表中。当我长按其中一个便笺时,它会将该便笺从列表中删除。在没有保存/加载方法的情况下,应用程序工作正常,但当我添加保存/加载方法时,我遇到了问题,因此我知道我的代码与内部存储存在问题 问题是:在onCreate()方法中加载file方法,在onClick和onItemLongClic

我正在开发一个简单的笔记应用程序来学习android,但我被困在fragment的内部存储中保存/加载。该片段基本上是一个带有数组适配器的列表视图。当我在EditText中键入内容并单击按钮时,它会将这些注释添加到列表中。当我长按其中一个便笺时,它会将该便笺从列表中删除。在没有保存/加载方法的情况下,应用程序工作正常,但当我添加保存/加载方法时,我遇到了问题,因此我知道我的代码与内部存储存在问题

问题是:在onCreate()方法中加载file方法,在onClick和onItemLongClick中保存file方法。当我启动应用程序时,它从文件中加载,没有问题。当我添加注释时,它会毫无问题地将该注释添加到列表中。当我在添加注释后长按注释时,它会毫无问题地删除该注释。但若我在添加便笺之前尝试长按便笺,那个么应用程序就会崩溃。或者,如果我转到应用程序中的另一个片段,然后返回到主片段并尝试长按一个注释,则应用程序再次崩溃

我的问题:您能否建议一种解决问题的方法,并帮助我将数据保存/加载到内部存储器

您可以在下面找到片段代码:

MainProjectLister.java:

public class MainProjectLister extends ListFragment implements
        AdapterView.OnItemClickListener,
        AdapterView.OnItemLongClickListener {

    Button addProjectButton;
    EditText addProjectEditText;
    public String projectTitle;
    Projekt newProjekt;
    ProjektSingleton projektSingleton;
    ArrayList<Projekt> projektArrayList;
    ArrayAdapter<String> adapter;
    ArrayList<Projekt> tempProjektArrayList;

    ArrayList<String> ListOfP;

    private final String FILENAME="testfile13.txt";
    private final String FILENAME2="testfile14.txt";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ListOfP = new ArrayList<String>();
        projektSingleton = ProjektSingleton.getInstance();
        projektSingleton.setProjektList(getSavedArrayList());
        ListOfP = getSavedStringList();

        ((AppCompatActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        setHasOptionsMenu(true);

        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){

        View view = inflater.inflate(R.layout.main_project_lister_layout, container, false);

        addProjectButton = (Button) view.findViewById(R.id.addProjectButton);
        addProjectEditText = (EditText) view.findViewById(R.id.addProjectEditText);

//addProjectButton onClck method

        addProjectButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){

//Checking if nothing is entered in the EditText and gives Error messaga
               if(TextUtils.isEmpty(addProjectEditText.getText().toString().trim())){
                    Toast.makeText(getActivity(), "Please type details", Toast.LENGTH_SHORT).show();
                    return;
                }

                projectTitle = addProjectEditText.getText().toString();
                newProjekt = new Projekt(projectTitle);
                projektArrayList = projektSingleton.getProjectList();
                projektArrayList.add(newProjekt);

                ListOfP.add(projectTitle);
                adapter.notifyDataSetChanged();
                saveArrayList(projektArrayList);
                saveStringList(ListOfP);

            }

        });

        getActivity().setTitle("Notes");

        return view;
        }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, ListOfP);
        setListAdapter(adapter);

        getListView().setOnItemClickListener(this);
        getListView().setOnItemLongClickListener(this);
    }

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l){

        MainProjectLister frag = new MainProjectLister();
        ProjectListFragmentChanger fragInterface = (ProjectListFragmentChanger) getActivity();
        fragInterface.projectListChangeFragment(frag);

        projektSingleton.setProjectNumber(i);

    }

    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l){

        projektArrayList.remove(i);
        ListOfP.remove(i);
        adapter.notifyDataSetChanged();
        saveArrayList(projektArrayList);
        saveStringList(ListOfP);
        Toast.makeText(getActivity(), "LongClick works!", Toast.LENGTH_SHORT).show();

        return true;
    }


    //Interface

    public interface ProjectListFragmentChanger{

        public void projectListChangeFragment(Fragment fragment);

    }

//Save File Method
    public void saveArrayList(ArrayList<Projekt> arrayList) {
        try {
            FileOutputStream fos = getActivity().openFileOutput(FILENAME, Context.MODE_PRIVATE);
            ObjectOutputStream out = new ObjectOutputStream(fos);
            out.writeObject(arrayList);
            out.close();
            fos.close();
            Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();

        } catch (IOException e) {
            e.printStackTrace ();
        }
    }

    public void saveStringList(ArrayList<String> arrayList) {
        try {
            FileOutputStream fos = getActivity().openFileOutput(FILENAME2, Context.MODE_PRIVATE);
            ObjectOutputStream out = new ObjectOutputStream(fos);
            out.writeObject(arrayList);
            out.close();
            fos.close();
            Toast.makeText(getActivity(), "2 x Success!", Toast.LENGTH_SHORT).show();

        } catch (IOException e) {
            e.printStackTrace ();
        }
    }


//Load Text File Method

    public ArrayList<Projekt> getSavedArrayList() {
        ArrayList<Projekt> savedArrayList = null;

        try {
            FileInputStream fis = getActivity().openFileInput(FILENAME);
            ObjectInputStream ois = new ObjectInputStream(fis);
            savedArrayList = (ArrayList<Projekt>) ois.readObject();
            ois.close();
            fis.close();
            Toast.makeText(getActivity(), "Loaded!", Toast.LENGTH_SHORT).show();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace ();
        }

        return savedArrayList;

    }

    public ArrayList<String> getSavedStringList() {
        ArrayList<String> savedArrayList = null;

        try {
            FileInputStream fis = getActivity().openFileInput(FILENAME2);
            ObjectInputStream ois = new ObjectInputStream(fis);
            savedArrayList = (ArrayList<String>) ois.readObject();
            ois.close();
            fis.close();
            Toast.makeText(getActivity(), "2 x Loaded!", Toast.LENGTH_SHORT).show();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace ();
        }

        return savedArrayList;

    }

}
public class ProjektSingleton {
    private static ProjektSingleton ourInstance = new ProjektSingleton();

    private ArrayList<Projekt> mProjektList;

    private int mProjectNumber;

    public static ProjektSingleton getInstance() {
        return ourInstance;
    }

    private ProjektSingleton() {
        mProjektList = new ArrayList<Projekt>();
    }

    public ArrayList<Projekt> getProjectList(){
        return mProjektList;
    }

    public void setProjektList(ArrayList<Projekt> ProjektList) {
        this.mProjektList = ProjektList;
    }

    public int getProjectNumber() {
        return mProjectNumber;
    }

    public void setProjectNumber(int projectNumber) {
        this.mProjectNumber = projectNumber;
    }
}
这是第133行:存储ArrayList的是我的singleton。如果我删除该行或删除加载方法,则不会出现错误

projektArrayList.remove(i);

将您得到的异常跟踪添加到您的问题中。Hi@MehdiB。我在问题中添加了错误消息,当我长按listview中的某个项目时,我得到了此错误。如果您能提供解决方案,我将不胜感激。请您运行上面更新的代码,并将您得到的完整异常粘贴到日志上,好吗?同时请指出代码中的第130行和第133行是什么。我已经把我的整个MainProjectLister.java代码、第133行、singleton类和整个错误消息放在了问题中。如果您能抽出时间查看并查看如何解决问题,这将非常有帮助。这是因为在长时间单击事件之前,您没有用数据填充
projektArrayList
。只有在
onClick
事件中,才可以使用数据填充它。
projektArrayList.remove(i);