У меня есть база данных> 100 объектов.Каждый объект имеет определенное имя файла изображения, строку темы, строку заголовка и имя файла PDF.
У меня есть вид деятельности в виде сетки.
При первом создании вид сетки будет загружать массив объектов для отображения.Точное содержимое массива может варьироваться в зависимости от запроса к базе данных, который я запускаю при первом открытии действия.
По умолчанию установлено, что все объекты из базы данных извлекаются и отображаются.Однако у меня бывают случаи, когда извлекается и отображается только подмножество объектов (в зависимости от предмета).
Нажатие на кнопку в сетке открывает действие, которое показывает pdf этого объекта.Хорошо.
Проблема в том, что, когда я «возвращаюсь» из действия PDF, представление сетки воссоздается.Всегда со всеми объектами «по умолчанию».
Таким образом, если у меня есть сетка, показывающая объекты только определенного «субъекта», если я затем открываю действие pdf, то по возвращении сетка заново создается и показывает всеобъекты, а не исходный вид сетки до начала действия pdf.
Вопрос: 1) Как вернуться к виду сетки БЕЗ его воссоздания?
Код:
public class SubjectListActivity extends AppCompatActivity {
String DB_NAME = "XXXXX.sqlite";
String TABLE_NAME = "XXXXX";
DataBaseHelper myDBHelper;
private GridView gridView;
private MyAdapter myAdapter;
private ArrayList<Subject> subjectsArrayList;
private Context context;
private String subjectAreas = ""; // this is sent to the activity from whichever activity opened it.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subject_list);
Bundle extras = getIntent().getExtras();
if (extras != null) {
subjectAreas = extras.getString("subjectAreas");
}
gridView = findViewById(R.id.gv);
// Database
AssetDatabaseOpenHelper assetDatabaseOpenHelper = new AssetDatabaseOpenHelper(this, DB_NAME);
assetDatabaseOpenHelper.saveDatabase();
myDBHelper = new DataBaseHelper(this, DB_NAME);
// populates subjectsArray
subjectsArrayList = populateSubjects();
loadGrid();
// listener
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String title = subjectsArrayList.get(position).getSubjectTitle();
String iconStyle = subjectsArrayList.get(position).getSubjectIconStyle();
String pdf = subjectsArrayList.get(position).getSubjectPDF();
String ref = subjectsArrayList.get(position).getSubjectRefs();
String linked = subjectsArrayList.get(position).getSubjectLinked();
Intent intent = new Intent(view.getContext(), SubjectActivity.class);
intent.putExtra("title", title);
intent.putExtra("icon", iconStyle);
intent.putExtra("pdf", pdf);
intent.putExtra("ref", ref);
intent.putExtra("linked", linked);
intent.putExtra("subjectAreas", subjectAreas);
startActivityForResult(intent, 1);
}
});
}
private void loadGrid(){
myAdapter = new MyAdapter(getApplicationContext(), subjectsArrayList);
gridView.setAdapter(myAdapter);
}
// The SQL query that populates the subjectArray depends on the 'subjectAreas' string which is set when the activity first opens. The default is 'getAllSubjects'
private ArrayList<Subject> populateSubjects() {
Cursor res = myDBHelper.getAllSubjects(TABLE_NAME);
if (subjectAreas.equals("emerg")){res = myDBHelper.getEmergSubjects(TABLE_NAME);}
else if (subjectAreas.equals("all")){res = myDBHelper.getAllSubjects(TABLE_NAME);}
else if (subjectAreas.equals("ax")){res = myDBHelper.getAxSubjects(TABLE_NAME);}
else if (subjectAreas.equals("mx")){res = myDBHelper.getMxSubjects(TABLE_NAME);}
else if (subjectAreas.equals("ref")){res = myDBHelper.getRefSubjects(TABLE_NAME);}
else if (subjectAreas.equals("cal")){res = myDBHelper.getCalSubjects(TABLE_NAME);}
else if (subjectAreas.equals("search")){res = myDBHelper.getSearchSubjects(TABLE_NAME, keywords);}
ArrayList<Subject> list = new ArrayList<>();
if (res.getCount() == 0) {
} else {
while (res.moveToNext()) {
Subject subject = new Subject();
subject.setSubjectID(res.getString(0));
subject.setSubjectTitle(res.getString(1));
subject.setSubjectIconStyle(res.getString(2));
subject.setSubjectPDF(res.getString(3));
subject.setSubjectKeywords(res.getString(4));
subject.setSubjectLinked(res.getString(5));
subject.setSubjectRefs(res.getString(6));
list.add(subject);
}
}
return list;
}
// Tried sending 'back' subjectAreas from PDF activity and re-populating the array and gridview - this doesn't seem to be called
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if(resultCode == RESULT_OK) {
subjectAreas = data.getStringExtra("subjectAreas");
subjectsArrayList = populateSubjects();
myAdapter = new MyAdapter(getApplicationContext(), subjectsArrayList);
gridView.invalidateViews();
gridView.setAdapter(myAdapter);
}
}
}
}
Заранее спасибо
ОБНОВЛЕНИЕ: Использование saveInstanceState to 'сохранить 'строку моего subjectAreas. Я использовал следующее:
private String subjectAreas = "";
private static final String subjectAreasSaved = "";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_subject_list);
Bundle extras = getIntent().getExtras();
if (extras != null) {
subjectAreas = extras.getString("subjectAreas");
title = extras.getString("title");
keywords = extras.getStringArrayList("keywords");
}
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
subjectAreas = savedInstanceState.getString(subjectAreasSaved);
}
И:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putString(subjectAreasSaved, subjectAreas);
super.onSaveInstanceState(savedInstanceState);
}
Вызывается ли onSaveINstanceState автоматически, когда второе действие является открытым, или мне нужноназывать это?В настоящее время, похоже, ничего не происходит