Как отобразить первый вопрос в arrayList с помощью модифицированного приложения API Quiz - PullRequest
0 голосов
/ 29 октября 2018

У меня есть проект викторины, и я хочу отобразить вопросы с несколькими вариантами ответов, здесь я использую два действия: один фрагмент и API для модификации, но когда я хочу отобразить первый вопрос, это всегда ошибка, а после следующего - второй вопрос

первое действие, которое я назвал StartQuestion в этом упражнении. Я использую модификацию для вызова данных из API

public class StartQuestionActivity extends AppCompatActivity implements View.OnClickListener {

Button start;
ArrayList<AssessmentResponse.Soal> dataSoalList;
SendData mSend;
String listSoal;

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


    fetchRemote();
    start = findViewById(R.id.btnStart);
    start.setOnClickListener(this);
}
 @Override
    public void onClick(View view) {
        Intent intent= new Intent(this,SelfLearningQuizActivity.class);
        intent.putExtra("listSoal",listSoal);
        startActivity(intent);
    }

здесь я назвал модифицированный API

 public void fetchRemote(){

    ApiCaller apiCaller = new ApiCaller();

    apiCaller.withListener(new OnApiListener<AssessmentResponse>() {
        @Override
        public void onApiSuccess(AssessmentResponse assessmentResponse) {
            dataSoalList = assessmentResponse.getResponData().getSoal();
            Gson gson = new Gson();
            listSoal = gson.toJson(dataSoalList);

        }

        @Override
        public void OnApiFailur(@NotNull AppError error) {
            Toast.makeText(getApplicationContext(),"Gagal",Toast.LENGTH_SHORT).show();

        }
    }).getAssesment(requestBody.build(),getApplicationContext());
}

после данных, которые я получил от StartActivity, я выполнил одно действие и один фрагмент для отображения вопроса. Я назвал SelfLeraningQuizActivity и SelfLearningQuizFragment

Код SelfLearningQuizActivty:

public class SelfLearningQuizActivity extends AppCompatActivity implements View.OnClickListener, StartQuestionActivity.SendData/*, SelfLearningQuizFragment.OnRadioGroupSelectedListener*/ {

private int mfragmentIndex=0;
private ViewPager viewPager;
public static int obtainedScore=0;
private Question currentQuestion;
private List<Question> questionsList;
private HashMap<String,Object> hashMap;
private ArrayList<AssessmentResponse.Soal> dataSoalList = new ArrayList<>() ;
private Button btnBack,btnNext;

private QuestionCallbacks mQuestionCallbacks;
private List<QuestionCallbacks> questionCallbacks = new ArrayList<>();

@Override
public void onSend(ArrayList<AssessmentResponse.Soal> listSoal) {
    /*dataSoalList = listSoal;
    Toast.makeText(this,dataSoalList.size(),Toast.LENGTH_LONG).show();*/
}

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_self_learning_quiz);
    btnBack = findViewById(R.id.btnBack);
    btnNext = findViewById(R.id.btnNext);

    viewPager = findViewById(R.id.view_pager);

    btnBack.setOnClickListener(this);
    btnNext.setOnClickListener(this);

    dataSoalList = new ArrayList<>();
    String listSoalString = getIntent().getStringExtra("listSoal");
    Gson gson = new Gson();
    Type type = new TypeToken<ArrayList<AssessmentResponse.Soal>>(){}.getType();
    ArrayList<AssessmentResponse.Soal> soalList = gson.fromJson(listSoalString, type);
    dataSoalList.addAll(soalList);
    setupViewPager(viewPager);

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

  if(mfragmentIndex == 0){
            questionCallbacks.get(mfragmentIndex).onSetQuestionData(dataSoalList.get(mfragmentIndex));

 }
    }

и этот код ошибки отображается для первого вопроса:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{brismart.bri.co.id/brismart.bri.co.id.SelfLearningQuizActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)
                  at android.app.ActivityThread.-wrap12(ActivityThread.java)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1516)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:160)
                  at android.app.ActivityThread.main(ActivityThread.java:6248)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:788)

если я не использую код, выведите первый вопрос результат: enter image description here

первый вопрос не может отображаться, но отображается второй вопрос: enter image description here

Установить ViewPager и Onclick:

private void setupViewPager(ViewPager viewPager) {

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

    int index = 0;
    for (AssessmentResponse.Soal soal:dataSoalList) {
        SelfLearningQuizFragment selfLearningQuizFragment = SelfLearningQuizFragment.newInstance(String.valueOf(index++));
        mQuestionCallbacks = selfLearningQuizFragment;
        adapter.addFrag(selfLearningQuizFragment,"Question"+index++);
        questionCallbacks.add(mQuestionCallbacks);
    }

    viewPager.setOffscreenPageLimit(adapter.getCount());
    viewPager.setAdapter(adapter);
}

@Override
public void onClick(View view) {
    if(view == btnBack){
        mfragmentIndex--;
        viewPager.setCurrentItem(mfragmentIndex);
    }else if(view == btnNext){
        mfragmentIndex++;
        viewPager.setCurrentItem(mfragmentIndex);
        questionCallbacks.get(mfragmentIndex).onSetQuestionData(dataSoalList.get(mfragmentIndex));
    }
}

Я использую интерфейс для отправки данных. Вопрос из Деятельности во фрагмент

public interface QuestionCallbacks{
    void onSetQuestionData(AssessmentResponse.Soal dataSoalList);
//        void onUserGoToNext(int index);
}

и это я отображаю Вопрос в SelfLearningQuizFragment

public class SelfLearningQuizFragment extends Fragment implements SelfLearningQuizActivity.QuestionCallbacks {
private static final String ARG_QUESTION_ID = "question_id";
private AssessmentResponse.Soal dataSoal;

private int answeredQsNo=0;

private TextView txtQuestion,tvNumberOfQuestions,totalQuestion;
private RadioButton rbtnA, rbtnB, rbtnC,rbtnD;
LinearLayout parent;
Button next;
RadioGroup radioGroup;
private int indexSoal=0;
private int rightAnswer=0;
private int wrongAnswer=0;

public SelfLearningQuizFragment(){

}
public static SelfLearningQuizFragment newInstance(String questionId1) {
    final SelfLearningQuizFragment fragment = new SelfLearningQuizFragment();
    final Bundle args = new Bundle();
    args.putString(ARG_QUESTION_ID,questionId1);
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_self_learning_quiz, container, false);

    totalQuestion = view.findViewById(R.id.totalQuestion);
    tvNumberOfQuestions = view.findViewById(R.id.tvNumberOfQuestions);
    txtQuestion=view.findViewById(R.id.tvQuestion);
    rbtnA=view.findViewById(R.id.opt1);
    rbtnB=view.findViewById(R.id.opt2);
    rbtnC=view.findViewById(R.id.opt3);
    rbtnD=view.findViewById(R.id.opt4);
//if i use on setQustiondata is nullpointer Textview
//        onSetQuestionData(dataSoal);



    @Override
    public void onSetQuestionData(AssessmentResponse.Soal dataSoalList) {


         dataSoal = dataSoalList;
    //        Toast.makeText(getActivity(), dataSoalList.getPertanyaan(), Toast.LENGTH_SHORT).show();
        txtQuestion.setText(dataSoal.getPertanyaan());
        tvNumberOfQuestions.setText(String.valueOf(indexSoal+1));
        rbtnA.setText(dataSoal.getOptAnswer().get(0).getTextAnswer());
        rbtnB.setText(dataSoal.getOptAnswer().get(1).getTextAnswer());
        rbtnC.setText(dataSoal.getOptAnswer().get(2).getTextAnswer());
        rbtnD.setText(dataSoal.getOptAnswer().get(3).getTextAnswer());
        radioGroup.setTag("true");
    }

есть идеи для этого? спасибо за помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...