Восстановить ArrayList в других действиях

У меня есть ввод с кнопкой для добавления элементов в список, но я хочу восстановить все элементы в другом действии, но есть 4 действия, в которых я хочу восстановить элементы. Я надеюсь, что кто-нибудь может мне помочь. Есть код моей MainActivity, где ввод для добавления в список

public class MainActivity extends AppCompatActivity {

private Button bt2;
private EditText et;
private Button bt;
private ListView lv;
public ArrayList<String> arrayList;
private ArrayAdapter<String> customeAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    et = (EditText) findViewById(R.id.editText);
    bt = (Button) findViewById(R.id.button);
    lv = (ListView) findViewById(R.id.listview);
    bt2 = (Button) findViewById(R.id.button2);

    arrayList = new ArrayList<String>();
    customeAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, arrayList);

    bt2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this, Main2Activity.class);
            intent.putStringArrayListExtra("arraylist",arrayList);
            startActivity(intent);
        }
    });

    lv.setAdapter(customeAdapter);
    onBtnClick();

}

public void onBtnClick() {
    bt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           String result = et.getText().toString();
           arrayList.add(result);
           customeAdapter.notifyDataSetChanged();
        }
    });
}

}

открытый класс Main2Activity расширяет AppCompatActivity {

private TextView tv;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    tv = (TextView) findViewById(R.id.tvMainTwo);


    Intent intent = getIntent();
    ArrayList<String> arrayList = intent.getStringArrayListExtra("arrayList");


    Random theRandom = new Random();
    int playersNumb = theRandom.nextInt(arrayList.size());
    tv.setText(tv.getText() + " " + arrayList.get(playersNumb));

}

}

Что именно вы хотите?

Beyazid 09.04.2019 14:41

Что вы подразумеваете под восстановлением? Вы хотите передать этот список активности?

Mayur Gajra 09.04.2019 14:41

Я создаю игру, в которой люди должны написать имя всех игроков, а затем в действии один из них выбирается случайным образом и пишется в textView. Это поможет вам понять, что я хочу сказать?

Gabriel Gofflot 09.04.2019 14:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
88
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

вы можете попробовать использовать общую модель представления для обмена данными между действиями. или вы можете сохранить данные в базу данных SQlite.

Viewmodel работает внутри одного и того же действия или фрагмента в зависимости от области действия.

Juan 09.04.2019 14:47

Для вашей проблемы есть встроенная функция Android. Это называется Intents и putExtra. Пример кода ниже

val parametersGoHere: ArrayList<SomethingParcalableOrSerializable> = arrayListOf()
val intent = Intent(context, AnotherActivity.javaClass).putExtra("key", parametersGoHere)
context.startActivity(intent)

В следующем упражнении вы можете восстановить данные, позвонив

(ArrayList<OfYourType>)(getIntent().getExtras().getSerializable("key"))

Как я могу получить список в другом действии?

Gabriel Gofflot 09.04.2019 14:48

Я добавил инструкцию к ответу.

Sebastian Pakieła 09.04.2019 14:51
Ответ принят как подходящий

В одном действии у вас есть ArrayList, который поддерживает ваш список. Вы обновляете ArrayList вводом данных через пользовательский интерфейс. Затем вы хотите использовать данные в этом ArrayList в других действиях.

Альтернативы, которые у вас есть:

1) Отправьте данные в intent.
Данные должны быть Serializable или Parcelable.

2) Пестите данные и дайте другим действиям прочитать сохраненные данные.
В некотором роде вам также потребуется сериализовать данные, чтобы сохранить их. Альтернативы для сохранения данных: SharedPreferences, flat file для удобства в личной папке хранилища приложения или в SQLite.

Если у вас есть сложные объекты в ArrayList как данные, один из способов сделать ArrayList строкой, которую можно сериализовать, — это закодировать ее в Json с помощью библиотеки Gson. В зависимости от выбранного вами пути вы можете использовать Gson() со всем ArrayList или с каждым элементом.

РЕДАКТИРОВАТЬ I

В частности, для ArrayList<String> вы можете отправить ArrayList в самом intent.

Intent intent = new Intent(this, AnotherActivity.class);
intent.putStringArrayListExtra("arraylist",arraylist);
startActivity(intent);

В классе AnotherActivity

private ArrayList<String> arraylist;

и в onCrate():

// Вам нужно будет добавить проверку нулевых значений.

Intent intent = getIntent();
arraylist = intent.getStringArrayListExtra("arraylist");

Как я могу это сделать ?

Gabriel Gofflot 09.04.2019 15:16

В этом проекте у меня всего 2 класса: MainActivity и Second.

Gabriel Gofflot 09.04.2019 15:22

Когда я использую arrayList в другом действии, действие перестает работать

Gabriel Gofflot 09.04.2019 15:49

Можете ли вы добавить код? и ошибка. Я изменил способ восстановления значения, если вы не использовали свойство для хранения ArrayList.

Juan 09.04.2019 16:05

Сделайте переменную arraylist свойством. Если вы по-прежнему получаете сообщение об ошибке, добавьте исключение, найденное в LogCat.

Juan 09.04.2019 16:11

Спасибо большое все работает. Последний вопрос, который я должен делать для каждого действия?

Gabriel Gofflot 09.04.2019 16:15

К сожалению, да.

Juan 09.04.2019 16:17

Чтобы открыть/отобразить второй экран, используйте Intnet и передайте массив с помощью extras.

Intent intent = new Intent(CurretnActivity.this, SecondActivity.class);
intent.putExtra("arrayList", arrayList);
startActivity(intent);

получить массив в SecondActivity, используя строку ниже.

ArrayList<String> arrayList = new ArrayList<>();
if (getIntent() != null) {
      arrayList = (ArrayList<String>) getIntent().getSerializableExtra("arrayList");
}

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

public class DataHolder {
private String data;
public String getData() {return data;}
public void setData(String data) {this.data = data;}

private static final DataHolder holder = new DataHolder();
public static DataHolder getInstance() {return holder;}
} 

для получения данных:

String data = DataHolder.getInstance().getData();

Лучше, чем обычные синглтоны, я предпочитаю использовать класс, который напрямую возвращает и записывает данные из/в SharedPreferences. Это избавит вас от этих NPE, когда ОС очистит синглтон в случае нехватки памяти.

Sufian 09.04.2019 15:10

вы можете проверить данные перед их использованием, но да, безопаснее использовать room или SharedPreferences

Poorya Taghizade 09.04.2019 15:15

Намерение.класс

To start others activities and send values.

Отправить значения

Map<String, String> hashMap = new HashMap<>(); // or List, or Set...
Intent intent = new Intent(SourceActivity.this, DestinationActivity.class);
intent.putExtra("hashMap", hashMap); // putArray(), putChars()...
startActivity(intent);

Получить значения

Intent intent = getIntent();    
HashMap<String, String> hashMap = (HashMap<String, String>)intent.getSerializableExtra("hashMap");

¡¡КОД НЕ ПРОВЕРЕН, НО ИДЕЯ ПРАВИЛЬНАЯ!!

Другие вопросы по теме