Skip to content Skip to sidebar Skip to footer

Getting Error In The App After Making Custom Fragments

I have made a quiz app in which I have stored the questions in database and then taken out from the database in the form of list and I am making custom fragments to upload the ques

Solution 1:

This is because you have an error when you are trying to add the questions. You are adding the same questions again and again.

Change the below code :

 currentQ = quesList.get(qid);
        List<FirstFragment> fragments =new Vector<FirstFragment>();
        fragments.add(FirstFragment.newInstance(0,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));
        qid++;
        fragments.add(FirstFragment.newInstance(1,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));
        qid++;
        fragments.add(FirstFragment.newInstance(2,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));

to

 currentQ = quesList.get(qid);
        List<FirstFragment> fragments =new Vector<FirstFragment>();
        fragments.add(FirstFragment.newInstance(0,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));
        qid++;
currentQ = quesList.get(qid);
        fragments.add(FirstFragment.newInstance(1,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));
        qid++;
currentQ = quesList.get(qid);
        fragments.add(FirstFragment.newInstance(2,currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()));

Solution 2:

I think your problem originates at these three lines because all those keys are the same.

args.putString("some_option1",radio_1);
args.putString("some_option1",radio_2);
args.putString("some_option1",radio_3);

Some suggestions, try to restructure your adapter filling code like so

quesList = db.getAllQuestions();
for (int page = 0; page < quesList.size(); page++) {
    Question currentQ = quesList.get(page);
    // Is that page parameter needed in here?
    FirstFragment questionFragment = FirstFragment.newInstance(page, currentQ);
    fragments.add(questionFragment);
}

mPagerAdapter = new com.example.android.viewpager4.PagerAdapter(this.getSupportFragmentManager(),fragments);

Notice that currentQ in the newInstance looks cleaner than currentQ.getQUESTION(),currentQ.getOPTA(),currentQ.getOPTB(),currentQ.getOPTC()


To prevent throwing around a List of Fragment objects, though, you could change the Adapter to take a List of Questions.

publicclassQuestionPagerAdapterextendsFragmentPagerAdapter
{
   private List<Question> questions;

    publicPagerAdapter(FragmentManager fm, List<Question> questions) {
        super(fm);
        this.questions = questions;
    }

    @Overridepublic Fragment getItem(int position)
    {
        Questionq= questions.get(position);
        // Is that int parameter needed here?return FirstFragment.newInstance(position, q);
    } 

    @OverridepublicintgetCount()
    {
        returnthis.questions.size();
    }
}

In both of those cases, you need to update the newInstance method.

publicstatic FirstFragment newInstance(int page, Question q)
{
    FirstFragmentfragmentFirst=newFirstFragment();
    Bundleargs=newBundle();
    args.putInt("someInt", page); // Is this needed?
    args.putString("some_question", q.getQUESTION());
    args.putString("some_option1",q.getOPTA());
    args.putString("some_option2",q.getOPTB());
    args.putString("some_option3",q.getOPTC());

    fragmentFirst.setArguments(args);
    return fragmentFirst;
}

Then, to make that method look a little cleaner, you could make some public static final String fields for those argument strings just like you made for the database keys.

For example

publicstaticfinalStringARG_QUESTION="some_question";
publicstaticfinalStringARG_OPT_A="some_option1"; 
// etc.

Then

args.putString(ARG_QUESTION, q.getQUESTION());
args.putString(ARG_OPT_A, q.getOPTA());
// etc.

And

Bundleargs= getArguments();
if (args != null) 
{
    question = args.getString(ARG_QUESTION, currentQ.getQUESTION());
    radio_1 = args.getString(ARG_OPT_A, currentQ.getOPTA());
    // etc.
}

And, finally, making Question implement Parcelable would be the best approach for passing data into the Fragment, that way, you don't need to get the currentQ back out of the database. (Because you are reading the entire database and only defaulting to the qid of 0 when those arguments are missing).

Post a Comment for "Getting Error In The App After Making Custom Fragments"