Сразу к делу:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText ename,eroll_no,emarks/*, gr*/;
Button add,view,viewall,delete,modify, groupe, addcat;
Spinner gr;
SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ename = (EditText)findViewById(R.id.name);
eroll_no = (EditText)findViewById(R.id.roll_no);
emarks = (EditText)findViewById(R.id.marks);
//gr = (EditText)findViewById(R.id.gr);
gr = (Spinner) findViewById(R.id.spinner);// сам спиннер из вида
add = (Button)findViewById(R.id.addbtn);
db = openOrCreateDatabase("Student_manage", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS student(rollno INTEGER UNIQUE,name VARCHAR,marks INTEGER,groupe VARCHAR);");
//вот я пытаюсь сделать:
Cursor cursor = db.rawQuery("SELECT * FROM groups", null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, new String[] {"name"}, new int[] {android.R.id.text1}); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
gr.setAdapter(adapter);
adapter.notifyDataSetChanged();//не работает
}
}
Вопрос. Сейчас когда я заполняю данные во второй активности и потом перехожу в MainActivity, в spinner они не обновляются. Когда захожу заново в приложение, все обновляется. Как сделать, чтобы они сразу обновлялись там?
adapter.notifyDataSetChanged()
Это не работает.
Полазив в интернете, я понял, что:
Данные в другой активити не обновятся, потому что я не передал туда обновлённые данные.
А при повторном запуске приложения всё читается, т.к. я сохраняю в БД и полностью вывожу ее содержимое. Пытался сделать так: В MainActivity при переходе на другую активити startActivityForResult(...)
затем в MainActivity переопределить метод onActivityResult(...), в котором обработать обновлённые данные. Эти данные надо положить в Intent в SecondActivity при переходе в MainActivity. Я попытался это реализовать, но не вышло. Вот вторая активити:
adds.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ename.getText().toString().trim().length()==0 || eroll_no.getText().toString().trim().length()==0 )
{
showMessage("Ошибка", "Заполните поля");
return;
}
Cursor c=db.rawQuery("SELECT * FROM groups WHERE rollno='"+eroll_no.getText()+"'", null);
if(c.getCount()>0) {
showMessage("Ответ:", "Такой ID уже есть!");
}else {
db.execSQL("INSERT INTO groups(rollno, name) VALUES('" + eroll_no.getText() + "','" + ename.getText() +"');");
showMessage("Ответ:", "Запись успешно добавлена!");
Cursor cursors = db.query("groups", new String[]{"_id","name"}, null, null, null, null, null);
Intent intent = new Intent();
intent.putExtra("name", cursors.toString());
setResult(RESULT_OK, intent);
finish();
}
clearText();
}
});
Здесь я пытался передать новый запрос (сделал строкой его). Вот MainActivity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (data == null) {return;}
String name = data.getStringExtra("name");
что делать далее я не знаю.... можете подсказать?
}
//это кнопка перехода во вторую активити
@Override
public void onClick(View v) {
Intent intent = new Intent(this, GroupActivity.class);
startActivityForResult(intent, 1);
startActivity(intent);
}
Вам не нужно передавать данные в активити, вам нужно сохранить их в БД в том месте, где вы их получили, а потом прочитать в другой активити уже обновленные данные прямо из БД.
Сделать это можно в методе onResume() активити, которая должна показать новые данные (в вашем случае MainActivity)/ Этот метод вызывается всякий раз, когда активити выходит на передний план (становится видима на экране).
Чтобы не писать дублирующийся код, разделим инициализацию адаптера на два этапа:
1 этап - создание адаптера и получение виджетов, в методе onCreate(), чтобы при каждом возврате на активити на передний план у нас не создавались новые объекты
2 этап - получение данных, в методе onResume(). Данные в адаптере будут обновляться каждый раз, когда активити выходит на передний план.
Так же для обновления CursorAdapter (и его наследников) используется метод swapCursor() или changeCursor() аргументом которого указывается курсор с обновленными данными, а не notifiDataSetChenged().
В MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
SimpleCursorAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
//Cursor cursor = db.rawQuery("SELECT * FROM groups", null);
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, null, new String[] {"name"}, new int[] {android.R.id.text1});
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
gr.setAdapter(adapter);
// adapter.notifyDataSetChanged();
}
}
Закомментированные строки следует удалить. Адаптер переносим в поле класса, для доступа к нему по всей активити. При создании адаптера указываем Cursor = null, данные мы добавим позже.
Обновляем данные в адаптере при появлении активити на переднем плане:
@Override
public void onResume(){
Cursor cursor = db.rawQuery("SELECT * FROM groups", null);
adapter.changeCursor(cursor);
}
переопределение метода onActivityResult() не требуется.
PS: вы не можете передавать курсор в виде строки (cursor.toString()) и надеяться, что после этого что то будет работать.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости