Сохранение данных ListView после выхода из Android-активности - PullRequest
0 голосов
/ 19 марта 2019

Я новичок в Android Studio. Я пытаюсь использовать ListView, где пользователь может добавлять элементы в список. Но когда пользователь меняет или закрывает действие, я хочу, чтобы элементы возвращались так, как они были в последний раз, когда пользователь их видел. Я не слишком знаком с жизненным циклом и тем, как его использовать, поэтому любой ресурс или помощь приветствуются. Благодарю. Вот мой код:

package com.example.listviewtest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity<i> extends AppCompatActivity {
    private List nameArr;
    private String textToAdd;
    //input textbox
    private EditText stuff;


    // Add player names and scores to the list
    private ListView score_lv;
    //Append
    private ArrayAdapter<String> arrayAdapter1;


    //Clear Scores button
    private Button updateButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        nameArr = new ArrayList<Object>();
        stuff  = (EditText)findViewById(R.id.editText);
        score_lv  = (ListView) findViewById(R.id.theList);
        arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nameArr);

        updateButton  = (Button) findViewById(R.id.addButton);
        updateButton.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        nameArr.add(stuff.getText().toString());
                        //get data from other activity
                        textToAdd = getIntent().getExtras().getString("textData");
                        score_lv.setAdapter(arrayAdapter1);
                    }
                });

        final Button nextAct = (Button) findViewById(R.id.toNext);
        nextAct.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        Intent j = new Intent(MainActivity.this, Main2Activity.class);
                        startActivity(j);
                    }
                }
        );
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

}

Edit:

Мне удалось обновить список с помощью FileInputStream и FileOutputStream (я пытаюсь записать во внутреннее хранилище). Поскольку у этого приложения есть 2 активизации, когда я переключаюсь на другую активность и возвращаюсь к этой, список и все его элементы остаются. Однако, когда я полностью закрываю приложение и затем снова открываю приложение, кажется, что все элементы в списке исчезают. Как мне сделать так, чтобы он продолжал использовать FileI / OStreams (я знаю, что есть другие методы, такие как SQLite и тому подобное, но я пытаюсь бросить вызов себе, используя другие методы). Вот мой обновленный код (еще раз спасибо всем за вашу помощь):

package com.example.listviewtest;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class MainActivity<i> extends AppCompatActivity {
    private static final List nameArr = new ArrayList<Object>();
    //input textbox
    private EditText stuff;


    // Add player names and scores to the list
    private ListView score_lv;
    //Append
    private ArrayAdapter<String> arrayAdapter1;

    //Clear Scores button
    private Button updateButton;

    private static final String fileName = "scores";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        stuff  = (EditText)findViewById(R.id.editText);
        score_lv  = (ListView) findViewById(R.id.theList);
        arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nameArr);

        score_lv.setAdapter(arrayAdapter1);

        //button to update the ListView
        updateButton  = (Button) findViewById(R.id.addButton);
        updateButton.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        //write data to the internal phone app File
                        try{
                            FileOutputStream fileOS = openFileOutput("scores", MODE_PRIVATE);
                            OutputStreamWriter osw = new OutputStreamWriter(fileOS);
                            try{
                                osw.write(stuff.getText().toString());
                                osw.flush();
                                osw.close();
                                Toast.makeText(getBaseContext(),"Scores Saved to "+getFilesDir() + "/", Toast.LENGTH_LONG).show();
                            }catch(IOException e){
                                e.printStackTrace();
                            }
                        }catch (FileNotFoundException e){
                            e.printStackTrace();
                        }

                        //read data from Saved File to update the ListView
                        nameArr.add(readFile("scores"));
                        score_lv.setAdapter(arrayAdapter1);
                    }
                });

        //button to go to the next Activity
        final Button nextAct = (Button) findViewById(R.id.toNext);
        nextAct.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        Intent j = new Intent(MainActivity.this, Main2Activity.class);
                        startActivity(j);
                    }
                }
        );
    }

    //as soon as this Activity starts, we read from the Output File
    public String readFile(String file){
        StringBuilder text = new StringBuilder();
        try{
            FileInputStream fis = openFileInput(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            String line;

            while((line = reader.readLine()) != null){
                text.append(line);
            }
            reader.close();
        }catch(Exception e){
            e.printStackTrace();
            Toast.makeText(MainActivity.this,"Error reading file!",Toast.LENGTH_LONG).show();
        }
        return text.toString();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Итак, я добавил кнопку «Очистить», но мне удалось сохранить несколько строк в файле «Score», который я сохранил во внутренней памяти устройства. Когда я закрываю приложение или перехожу к другому действию и возвращаюсь к этому MainActivity с ListView, информация остается (потому что она считывает непосредственно из файла «показателей»). Единственное, что он обновляет 1 и только элемент ListView. Я использовал nameArr.clear (); очищать ListView каждый раз и nameArr.clear (); и text.append ('\ n'); читать и записывать в файл, чтобы каждый текстовый ввод пользователя отображался так, как я хочу, чтобы он (в виде списка) . Итак, вот мой окончательный код:

public class MainActivity<i> extends AppCompatActivity {
    private static final List nameArr = new ArrayList<Object>();
    //input textbox
    private EditText stuff;


    // Add player names and scores to the list
    private ListView score_lv;
    //Append
    private ArrayAdapter<String> arrayAdapter1;

    //Clear Scores button
    private Button updateButton;

    private static final String fileName = "scores";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        stuff  = (EditText)findViewById(R.id.editText);
        score_lv  = (ListView) findViewById(R.id.theList);
        arrayAdapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, nameArr);

        nameArr.clear();
        nameArr.add(readFile(fileName));
        score_lv.setAdapter(arrayAdapter1);

        //button to update the ListView
        updateButton  = (Button) findViewById(R.id.addButton);
        updateButton.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                                                //write data to the internal phone app File
                        try{
                            FileOutputStream fileOS = openFileOutput(fileName, MODE_APPEND);
                            OutputStreamWriter osw = new OutputStreamWriter(fileOS);
                            try{
                                osw.write("\n");
                                osw.write(stuff.getText().toString());
                                osw.flush();
                                osw.close();
                                Toast.makeText(getBaseContext(),"Scores Saved to "+getFilesDir() + "/", Toast.LENGTH_LONG).show();
                            }catch(IOException e){
                                e.printStackTrace();
                            }
                        }catch (FileNotFoundException e){
                            e.printStackTrace();
                        }


                        //read data from Saved File to update the ListView with ALL items from the file
                        nameArr.clear();
                        nameArr.add(readFile(fileName));
                        score_lv.setAdapter(arrayAdapter1);
                    }
                });

        //button to go to the next Activity
        final Button nextAct = (Button) findViewById(R.id.toNext);
        nextAct.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        Intent j = new Intent(MainActivity.this, Main2Activity.class);
                        startActivity(j);
                    }
                }
        );

        //delete file and clear ListView button
        final Button clearB = (Button) findViewById(R.id.clearButton);
        clearB.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        deleteFile(fileName);
                        Toast.makeText(getBaseContext(), "List Cleared", Toast.LENGTH_LONG).show();
                        //clear list
                        score_lv.setAdapter(null);
                    }
                }
        );
    }

    //as soon as this Activity starts, we read from the Output File
    public String readFile(String file){
        StringBuilder text = new StringBuilder();
        try{
            FileInputStream fis = openFileInput(file);
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            String line;

            while((line = reader.readLine()) != null){
                text.append(line);
                text.append('\n');
            }
            reader.close();
        }catch(Exception e){
            e.printStackTrace();
            Toast.makeText(MainActivity.this,"Error reading file!",Toast.LENGTH_LONG).show();
        }
        return text.toString();
    }
0 голосов
/ 19 марта 2019

@ rodgy, сохраните ваши данные в энергонезависимой памяти , затем прочитайте данные при загрузке приложения.

Попробуйте этот код

private List<String> nameArr = new ArrayList<>();
private static SharedPreferences sharedPreferences = context.getSharedPreferences("PREFS_NAME", Context.MODE_PRIVATE);
private static SharedPreferences.Editor editor = sharedPreferences.edit();

#how to use

// save data
setToList("1", nameArr);

// get data
nameArr = getList("1");

// save to sharedPreferences
public void setList(String key, List<String> list) {
    String json = new Gson().toJson(list);
    editor.putString(key, json);
    editor.commit();
}

// read from sharedPreferences
public List<String> getList(String key){
    List<String> result = new ArrayList<>();
    String serObject = sharedPreferences.getString(key, null); 
    if (serObject != null){
        Type type = new TypeToken<List<String>>(){}.getType(); 
        result = new Gson().fromJson(serObject, type); 
    }
    return result;
}
...