У меня есть действие под названием CBT_practice , в котором хранятся фрагменты: target_fragment , subjective_fragment и history_fragment .Эти фрагменты добавляются в действие динамически с помощью viewpager.
Но у меня есть проблема с target_fragment после его добавления в viewpager.Родительское действие (CBT_practice) использует LoaderManager для создания запроса sqlite db для получения списка вопросов, после чего фрагмент получает доступ к фрагменту в его жизненном цикле onCreateView
и затем сохраняется в переменной.
Однако только после того, как я свернул и восстановил экран телефона (т. Е. Когда действие было приостановлено, а затем возобновлено), и я попытался вызвать метод в файлеjective_fragment (getScore()
) из родительского действия (CBT_practice)при нажатии кнопки я получаю сообщение об ошибке, в котором говорится, что размер списка равен 0. Этого не происходит, когда я не минимизирую и не восстанавливаю действие
Список получен из родительского действия и назначенв методе OnCreateView
После приостановки и возобновления действия listSize возвращает 60 в методе OnCreateView
, но 0 в getScore()
методе
ThisУдивительно, поскольку список был сохранен в глобальной переменной, а затем назначен в методе onCreateView
. Вот обратный вызов загрузчика родительской активности, который получает список вопросов из db:
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
progressBarLN.setVisibility(View.GONE);
data.moveToFirst();
while(!data.isAfterLast()){
id = data.getString(data.getColumnIndex("_id"));
topic_id_selected = data.getString(data.getColumnIndex("topic_id"));
year_id_selected = data.getString(data.getColumnIndex("year_id"));
ques_num = data.getString(data.getColumnIndex("question_num"));
ques = data.getString(data.getColumnIndex("question"));
ans = data.getString(data.getColumnIndex("answer"));
ans_desc = data.getString(data.getColumnIndex("answer_desc"));
opt_ans_id = data.getString(data.getColumnIndex("option_answer_id"));
opt_1 = data.getString(data.getColumnIndex("option_A"));
opt_2 = data.getString(data.getColumnIndex("option_B"));
opt_3 = data.getString(data.getColumnIndex("option_C"));
opt_4 = data.getString(data.getColumnIndex("option_D"));
opt_5 = data.getString(data.getColumnIndex("option_E"));
ques_type_id = data.getString(data.getColumnIndex("question_type_id"));
selected_ans_id = data.getString(data.getColumnIndex("selected_answer_id"));
QuestionAnswerList ques_item = new QuestionAnswerList(ques_num, ques, ans, ans_desc, opt_ans_id, opt_1, opt_2, opt_3,
opt_4, opt_5, ques_type_id, selected_ans_id, topic_id_selected, year_id_selected);
topic_name = get_topic_name(topic_id_selected);
ques_item.set_topic_name(topic_name);
if(ques_item.opt_1!=null && ques_item.opt_2!=null && ques_item.opt_3!=null)
ques_item.setOptions(isShuffleOpt);
ques_ans_list.add(ques_item);
//ques_ans_list contains the list of questions retrieved from the db
data.moveToNext();
}
if(isShuffleQues) Collections.shuffle(ques_ans_list);
viewPager = (ViewPager)findViewById(R.id.viewpager);
//viewPager.setOffscreenPageLimit(ques_type_count);
setUpViewPager(viewPager, ques_type);
tabLayout = (TabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
Вот код в родительской активности, который вызывает метод getScore () после нажатия кнопки
//get the objective_fragment
Fragment fragment = adapter.getItem(0);
//calls the getScore() method
((obj_fragment) fragment).getScore();
Вот фрагмент OnCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
View view = inflater.inflate(R.layout.fragment_obj_tv, container, false);
preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
quesNoTV = (TextView) view.findViewById(R.id.quesNoTV);
webView = (TextView) view.findViewById(R.id.webview);
rad1 = (RadioButton) view.findViewById(R.id.opt1);
rad2 = (RadioButton) view.findViewById(R.id.opt2);
rad3 = (RadioButton) view.findViewById(R.id.opt3);
rad4 = (RadioButton) view.findViewById(R.id.opt4);
rad5 = (RadioButton) view.findViewById(R.id.opt5);
radGrp = (RadioGroup) view.findViewById(R.id.radiogroup);
rad1.setOnClickListener(radClickListener);
rad2.setOnClickListener(radClickListener);
rad3.setOnClickListener(radClickListener);
rad4.setOnClickListener(radClickListener);
rad5.setOnClickListener(radClickListener);
submit = (Button) view.findViewById(R.id.submit);
next.setOnClickListener(clickListener);
previous = (Button) view.findViewById(R.id.previous);
previous.setOnClickListener(clickListener);
//getting the parent activity
activity = (CBT_Practice) getActivity();
//assigning the list from the parent activity to the fragment ques_list variable
ques_list = activity.ques_ans_list;
//listSize here is 60
listSize = ques_list.size();
ques_obj = ques_list.get(startIndex);
show_question(ques_obj);
return view;
}
Вот фрагментgetScore()
method
public int getScore(){
Intent intent;
Bundle args = new Bundle();
ArrayList<QuestionAnswerList> casted_list = new ArrayList<>(ques_list);
int correct = 0;
for(QuestionAnswerList item : ques_list){
if(item.getPicked_ans_id()==item.get_shuffle_ans_id()&&item.getPicked_ans_id()!=-1) correct = correct+1;
}
int num = correct;
correct = (correct*100)/listSize;
//listSize here is 0
if(activity.ques_type.get(0).equals("0")) {
intent = new Intent(getActivity(), ResultActivity.class);
args.putInt("score", correct);
args.putInt("numOfQues", objective_list.size());
args.putInt("correct", num);
}
else
intent = new Intent(getActivity(), Answers.class);
args.putStringArrayList("types", new ArrayList<>(activity.ques_type));
args.putParcelableArrayList("list", casted_list);
intent.putExtras(args);
getActivity().startActivity(intent);
return correct;
}
Также у меня есть копия этого точного кода, которая отлично работает, но с тех пор, как я добавил firebase в свой проект, я получил ошибку.Я не знаю, могли ли зависимости Firebase вызвать ошибку.Я также пытался использовать состояния сохраненного экземпляра и реализовал определенные жизненные циклы действий, но все безрезультатно