У меня есть 5 степперов (A> B> C> D> E), и я получаю Id темы из степпера A. В степпере B есть набор вопросов, использующих данные темы Id.
В шаговом B он проверяет, есть ли еще ответы, если есть, переключатель проверил.Он работает нормально с одним вопросом, но проблема возникает при большом количестве вопросов. Например, я выбрал «да» на вопрос один, а не на второй вопрос, поэтому я возвращаюсь к степперу А и снова возвращаюсь к степперу B , когда явместо этого вернул все варианты выбора да.
Другая проблема - когда я проверяю первый вопрос, другой вопрос тоже проверяется при прокрутке макета
FormCoachingFragment.java
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.fusi24.berau.hse.BaseApplication;
import com.fusi24.berau.hse.R;
import com.fusi24.berau.hse.adapter.FormCoachingAdapter;
import com.fusi24.berau.hse.base.BaseFragment;
import com.fusi24.berau.hse.data.entity.DataAnswers;
import com.fusi24.berau.hse.data.entity.DataQuestion;
import com.google.gson.Gson;
import com.stepstone.stepper.Step;
import com.stepstone.stepper.VerificationError;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import timber.log.Timber;
public class FormCoachingFragment extends BaseFragment
implements FormCoachingView, Step {
@BindView(R.id.rv_coaching)
RecyclerView rvCoaching;
@BindView(R.id.ll_coacher_notes)
LinearLayout llCoacherNotes;
@BindView(R.id.et_coacher_notes)
EditText etNotesCoaching;
private BaseApplication application;
private Unbinder unbinder;
private FormCoachingPresenter presenter;
private List<DataAnswers> answersList;
private List<DataQuestion> questionList;
private FormCoachingAdapter adapter;
String topicIdTemp = "0";
Gson gson = new Gson();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
application = (BaseApplication) context.getApplicationContext();
presenter = new FormCoachingPresenter(
getManager(), getAndroidScheduler(), getProcessScheduler());
presenter.attachView(this);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_form_coaching, container, false);
unbinder = ButterKnife.bind(this, view);
return view;
}
@Override
public VerificationError showDataQuestion(List<DataQuestion> questionList) {
this.questionList.clear();
this.questionList.addAll(questionList);
adapter.notifyDataSetChanged();
if (questionList.size() == 0) {
llCoacherNotes.setVisibility(View.GONE);
return new VerificationError(getString(R.string.err_question_coaching_required));
} else {
llCoacherNotes.setVisibility(View.VISIBLE);
}
if (TextUtils.isEmpty(etNotesCoaching.getText())) {
return new VerificationError(getString(R.string.err_coacher_notes_required));
}
return null;
}
@Nullable
@Override
public VerificationError verifyStep() {
if (questionList.size() == 0) {
return new VerificationError(getString(R.string.err_question_coaching_required));
}
if (answersList.size() < questionList.size()) {
return new VerificationError("Jawaban Topik Dibutuhkan");
}
application.getCoaching().setNote(etNotesCoaching.getText().toString());
application.setAnswers(answersList);
System.out.println("DEVELOPER HASIL DATA ANSWER 1 : " + gson.toJson(answersList));
return null;
}
@Override
public void onSelected() {
if (!topicIdTemp.equals(application.getTopicPosition().getTopic().getId())){
topicIdTemp = application.getTopicPosition().getTopic().getId();
presenter.getDataQuestion(Integer.valueOf(topicIdTemp));
answersList = new ArrayList<>();
Timber.i("DEVELOPER : New Id Topic, make a new Question");
} else if (topicIdTemp.equals(application.getTopicPosition().getTopic().getId())){
presenter.getDataQuestion(Integer.valueOf(topicIdTemp));
Timber.i("DEVELOPER : Topic ID same");
}
if (!TextUtils.isEmpty(application.getCoaching().getNote())) {
etNotesCoaching.setText(application.getCoaching().getNote());
}
questionList = new ArrayList<>();
adapter = new FormCoachingAdapter(context, questionList, answersList);
rvCoaching.setLayoutManager(new LinearLayoutManager(context));
rvCoaching.setItemAnimator(new DefaultItemAnimator());
rvCoaching.setAdapter(adapter);
}
@Override
public void onError(@NonNull VerificationError error) {
Toast.makeText(context, error.getErrorMessage(), Toast.LENGTH_SHORT).show();
Timber.w(error.getErrorMessage());
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void onDestroy() {
super.onDestroy();
presenter.detachView();
}
@Override
public void showError(Throwable throwable) {
Timber.w(throwable);
}
}
FormCoachingAdapter.java
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import com.fusi24.berau.hse.R;
import com.fusi24.berau.hse.base.BaseAdapter;
import com.fusi24.berau.hse.data.entity.DataAnswers;
import com.fusi24.berau.hse.data.entity.DataQuestion;
import com.google.gson.Gson;
import java.math.BigInteger;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class FormCoachingAdapter extends BaseAdapter<FormCoachingAdapter.FormHolder> {
private Context context;
private List<DataQuestion> questionList;
private List<DataAnswers> answersList;
public FormCoachingAdapter(Context context, List<DataQuestion> questionList, List<DataAnswers> answersList){
this.context = context;
this.questionList = questionList;
this.answersList = answersList;
}
class FormHolder extends RecyclerView.ViewHolder {
@BindView(R.id.rg_common)
RadioGroup rgCommon;
@BindView(R.id.rb_yes)
RadioButton rbYes;
@BindView(R.id.rb_no)
RadioButton rbNo;
@BindView(R.id.tv_descriptions)
TextView tvDescriptions;
FormHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
@NonNull
@Override
public FormHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context)
.inflate(R.layout.row_common_checklist_two, parent, false);
return new FormHolder(itemView);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull FormHolder holder, int position) {
DataQuestion question = questionList.get(position);
DataAnswers answers = new DataAnswers();
Gson gson = new Gson();
System.out.println("DEVELOPER HASIL DATA : " + gson.toJson(answersList));
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
/*answers.setAnswer1("");
answers.setAnswer2("");*/
if(answersList.size() != 0){
for (DataAnswers dataAnswers : answersList){
if (dataAnswers.getAnswer1().equals("Y")) {
holder.rbYes.setChecked(true);
} else {
holder.rbNo.setChecked(true);
}
}
}
holder.rgCommon.setOnCheckedChangeListener((group, checkedId) -> {
RadioButton rb = holder.itemView.findViewById(checkedId);
for (int i=0; i<answersList.size(); i++) {
if (answersList.get(i).getQuestionId().equals(answers.getQuestionId())) {
answersList.remove(i);
break;
}
}
switch (rb.getId()) {
case R.id.rb_yes:
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
answers.setAnswer1("Y");
answers.setAnswer2("");
answersList.add(answers);
break;
case R.id.rb_no:
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
answers.setAnswer1("N");
answers.setAnswer2("");
answersList.add(answers);
break;
}
});
holder.tvDescriptions.setText((position + 1) + ". " + question.getQuestion());
}
@Override
public void onViewAttachedToWindow(@NonNull FormHolder holder) {
super.onViewAttachedToWindow(holder);
}
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return questionList.size();
}
}
DataAnswers.java
import android.os.Parcel;
import android.os.Parcelable;
import java.math.BigInteger;
public class DataAnswers implements Parcelable {
private BigInteger questionId;
private String answer1;
private String answer2;
public BigInteger getQuestionId() {
return questionId;
}
public void setQuestionId(BigInteger questionId) {
this.questionId = questionId;
}
public String getAnswer1() {
return answer1;
}
public void setAnswer1(String answer1) {
this.answer1 = answer1;
}
public String getAnswer2() {
return answer2;
}
public void setAnswer2(String answer2) {
this.answer2 = answer2;
}
public DataAnswers(){}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(this.questionId);
dest.writeString(this.answer1);
dest.writeString(this.answer2);
}
protected DataAnswers(Parcel in) {
answer1 = in.readString();
answer2 = in.readString();
}
public static final Creator<DataAnswers> CREATOR = new Creator<DataAnswers>() {
@Override
public DataAnswers createFromParcel(Parcel in) {
return new DataAnswers(in);
}
@Override
public DataAnswers[] newArray(int size) {
return new DataAnswers[size];
}
};
}
ОБНОВЛЕНИЕ
FormCoachingAdapter.java
public class FormCoachingAdapter extends BaseAdapter<FormCoachingAdapter.FormHolder> {
private Context context;
private List<DataQuestion> questionList;
private List<DataAnswers> answersList;
//variable to hold selected Item position
private int mSelectedItemPosition = -1;
public FormCoachingAdapter(Context context, List<DataQuestion> questionList, List<DataAnswers> answersList) {
this.context = context;
this.questionList = questionList;
this.answersList = answersList;
}
class FormHolder extends RecyclerView.ViewHolder {
@BindView(R.id.rg_common)
RadioGroup rgCommon;
@BindView(R.id.rb_yes)
RadioButton rbYes;
@BindView(R.id.rb_no)
RadioButton rbNo;
@BindView(R.id.tv_descriptions)
TextView tvDescriptions;
FormHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
@NonNull
@Override
public FormHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(context)
.inflate(R.layout.row_common_checklist_two, parent, false);
return new FormHolder(itemView);
}
@SuppressLint("SetTextI18n")
@Override
public void onBindViewHolder(@NonNull FormHolder holder, int position) {
DataQuestion question = questionList.get(position);
DataAnswers answers = new DataAnswers();
Gson gson = new Gson();
System.out.println("DEVELOPER ANSWER : " + gson.toJson(answersList));
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
System.out.println("DEVELOPER POSITION : " + position + " , " + mSelectedItemPosition);
//Handle selection state
if (position == mSelectedItemPosition) {
// already selected
if (answersList.size() != 0) {
for(DataAnswers dataAnswers : answersList){
if (dataAnswers.getAnswer1().equals("Y")) {
holder.rbYes.setChecked(true);
} else {
holder.rbNo.setChecked(true);
}
}
} else {
Timber.i("DATA DEVELOPER : ");
}
}
holder.rgCommon.setOnCheckedChangeListener((group, checkedId) -> {
RadioButton rb = holder.itemView.findViewById(checkedId);
//Handling selection state changed
mSelectedItemPosition = holder.getAdapterPosition();
for (int i = 0; i < answersList.size(); i++) {
if (answersList.get(i).getQuestionId().equals(answers.getQuestionId())) {
answersList.remove(i);
break;
}
}
switch (rb.getId()) {
case R.id.rb_yes:
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
answers.setAnswer1("Y");
answers.setAnswer2("");
answersList.add(answers);
break;
case R.id.rb_no:
answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
answers.setAnswer1("N");
answers.setAnswer2("");
answersList.add(answers);
break;
}
});
holder.tvDescriptions.setText((position + 1) + ". " + question.getQuestion());
}
@Override
public void onViewAttachedToWindow(@NonNull FormHolder holder) {
super.onViewAttachedToWindow(holder);
}
public int getItemViewType(int position) {
return position;
}
@Override
public int getItemCount() {
return questionList.size();
}
}