Как добавить элемент в список массивов из одного действия и из другого действия

Я делаю приложение, которое состоит из вопросов с несколькими вариантами ответов. Каждый вопрос имеет свою активность, например QuestionTwoActivity. Каждый раз, когда пользователь нажимает кнопку, например, кнопку для ответа А, он перемещает его к следующему действию, например, от QuestionTwoActivity к QuestionThreeActivity. Если ответ правильный, он увеличивает их оценку на 3. В нем десять вопросов и общая возможная оценка 30.

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

Вот код для gradeActivity, который открывается только после ответа на десятый вопрос:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;

public class Grade extends AppCompatActivity{

    examark mExamGrade; // declaring an instance of the examark class to call getMark method
    double mark; // an int object to store the exam mark in it
    TextView mGradeTextView;
    TextView mNameTextView;
    ListView mPreviewListView;
    static ArrayList<answers_preview_data> mPreviewArrayList;
    PreviewAdapter mPreviewAdapter;
    examark name;

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

        int colorRed = getResources().getColor(R.color.colorRed);
        int colorOrange = getResources().getColor(R.color.colorOrange);
        int colorYellow = getResources().getColor(R.color.colorYellow);
        int colorGreen = getResources().getColor(R.color.colorGreen);

        mExamGrade = new examark();
        name = new examark();

        mark = mExamGrade.getExamMark();// storing the exam mark in the mark variable

        mGradeTextView = (TextView) findViewById(R.id.grade); // initializing the view responsible for showing the final mark

        mGradeTextView.setText(String.valueOf(mark));

        mNameTextView = (TextView) findViewById(R.id.name_text_view);

        String nameOfQuizzer = name.getNameOfQuizTaker();

        mNameTextView.setText(nameOfQuizzer);

        mPreviewArrayList = new ArrayList<answers_preview_data>();
        mPreviewAdapter = new PreviewAdapter(this, mPreviewArrayList);
        mPreviewListView = (ListView) findViewById(R.id.preview_list);
        mPreviewListView.setAdapter(mPreviewAdapter);

        // a conditional statement to change the color of the grade based on how good the preformence
        if ( mark > 0.0 && mark < 10.0 ) {

            mGradeTextView.setTextColor(colorRed);

        } else if (mark > 10.0 && mark <= 15.0) {

            mGradeTextView.setTextColor(colorOrange);

        } else if (mark > 15.0 && mark < 20.0) {

            mGradeTextView.setTextColor(colorYellow);
        } else if (mark > 20.0) {

            mGradeTextView.setTextColor(colorGreen);
        }
    }
}

Вот код одного из ответов onclickListner:

mAnswerATextView.setText("A-Labour Party");

    mAnswerATextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Grade.mPreviewArrayList.add(new answers_preview_data("1", "the answer of question A" , " the true answer of  question 1", R.color.colorGreen, R.drawable.correct));
            Intent openQuestion = new Intent(QuestionOne.this ,QuestionTwo.class);
            startActivity(openQuestion);
            mExamark.incrementMark();
        }
    });

Вот что говорит меню отладчика при нажатии кнопки ответа:

E/AndroidRuntime: FATAL EXCEPTION: main  
Process: com.example.admin.xams, PID: 16254
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
    at com.example.admin.xams.QuestionOne$1.onClick(QuestionOne.java:52)
    at android.view.View.performClick(View.java:4848)
    at android.view.View$PerformClick.run(View.java:20270)
    at android.os.Handler.handleCallback(Handler.java:815)
    at android.os.Handler.dispatchMessage(Handler.java:104)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5667)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:962)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

Есть ли способ добавить элемент в список массивов из других действий до того, как действие, содержащее список массивов, будет открыто (установлено в onCreate)?

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

Ответы 2

Ответ принят как подходящий

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

  • Плохо, но быстро — инициализируйте список внутри вашего конструктора Activity вместо метода onCreate()
  • Правильно, но медленно - храните свои значения в базе данных и извлекайте их, когда они вам понадобятся.

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

У вас может быть свой Application, но если нет, вам также нужно будет зарегистрировать его в своем манифесте.

Итак, я создал приложение под названием MyApp, которое происходит от Application. Это будет содержать список ответов, к которым мы можем получить доступ из любого места.

public class MyApp extends Application {

    // A public static list of answers
    public static ArrayList<answers_preview_data> answers = new ArrayList<>();

    @Override
    public void onCreate() {
        super.onCreate();
        // do other app setup ...
    }
}

Теперь, среди ваших вопросов, мы можем легко добавить новый ответ в этот список.

public class QuestionOne extends AppCompatActivity implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        // Adding the new answer to your list.
        MyApp.answers.add(new answers_preview_data());
    }

}

И в вашем классе Grade мы можем получить список и использовать его локально.

public class Grade extends AppCompatActivity {

    private ArrayList<answers_preview_data> mPreviewArrayList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPreviewArrayList = MyApp.answers;
        // use your list ...
    }
}

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