У меня есть ввод с кнопкой для добавления элементов в список, но я хочу восстановить все элементы в другом действии, но есть 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));
}
}
Что вы подразумеваете под восстановлением? Вы хотите передать этот список активности?
Возможный дубликат Как обмениваться одними и теми же данными между несколькими действиями
Я создаю игру, в которой люди должны написать имя всех игроков, а затем в действии один из них выбирается случайным образом и пишется в textView. Это поможет вам понять, что я хочу сказать?
вы можете попробовать использовать общую модель представления для обмена данными между действиями. или вы можете сохранить данные в базу данных SQlite.
Viewmodel работает внутри одного и того же действия или фрагмента в зависимости от области действия.
Для вашей проблемы есть встроенная функция 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"))
Как я могу получить список в другом действии?
Я добавил инструкцию к ответу.
В одном действии у вас есть 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");
Как я могу это сделать ?
В этом проекте у меня всего 2 класса: MainActivity и Second.
Когда я использую arrayList в другом действии, действие перестает работать
Можете ли вы добавить код? и ошибка. Я изменил способ восстановления значения, если вы не использовали свойство для хранения ArrayList.
Сделайте переменную arraylist свойством. Если вы по-прежнему получаете сообщение об ошибке, добавьте исключение, найденное в LogCat.
Спасибо большое все работает. Последний вопрос, который я должен делать для каждого действия?
К сожалению, да.
Чтобы открыть/отобразить второй экран, используйте 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, когда ОС очистит синглтон в случае нехватки памяти.
вы можете проверить данные перед их использованием, но да, безопаснее использовать room или SharedPreferences
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");
¡¡КОД НЕ ПРОВЕРЕН, НО ИДЕЯ ПРАВИЛЬНАЯ!!
Что именно вы хотите?