Android - возврат к предыдущей активности без ее повторного создания - PullRequest
0 голосов
/ 18 июня 2019

У меня есть база данных> 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);
        }
    }
}

}

Заранее спасибо

Gridview showing only 'Management' subject objects After going back from viewing pdf, the Grdiview now shows all subject objects, not just 'Management' ones

ОБНОВЛЕНИЕ: Использование 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 автоматически, когда второе действие является открытым, или мне нужноназывать это?В настоящее время, похоже, ничего не происходит

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Отдых до рамок. Если он решит, что ему нужны ресурсы, он уничтожит предыдущую копию, хотите вы этого или нет. Вы не можете это остановить.

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

0 голосов
/ 18 июня 2019

Во-первых, следует отдать должное авторам, которые очень помогли.

Проблема с моим кодом прекрасно объяснена и решена с помощью этой темы: Тема Stackoverflow

По сути, кнопка «Домой» на панели действий приводит к воссозданию предыдущего действия.Отсюда и моя проблема.Когда я пытался реализовать InstanceState, я продолжал получать 'null' для saveInstanceState ... что привело меня к теме, которую я связал выше.

Я действительно надеюсь, что это поможет другим

...