Как установить флажок, если ответы уже существуют? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть 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();
    }

}

1 Ответ

0 голосов
/ 23 сентября 2019

RecyclerView повторяет представление в OnBindViewHolder. Так, когда элементы нажимаются / проверяются, он получает reflected в некоторых других позициях.

Чтобы решить эту проблему, вы можете попробоватькак ниже.

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 HASIL DATA : " + gson.toJson(answersList));

        answers.setQuestionId(BigInteger.valueOf(Long.valueOf(question.getId())));
        /*answers.setAnswer1("");
        answers.setAnswer2("");*/

        //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{
             // not selected yet(default)
          }

        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();
    }

}

ОБНОВЛЕНИЕ Если у вас возникли трудности с указанным выше способом, вы можете попробовать выполнить следующие действия.

Вам необходимо добавить variable с именем isChecked вваш DataQuestion.Когда пользователь проверяет любой ответ на recyclerview, мы просто устанавливаем значение true в этом поле.

public class DataQuestion {

    ....
    private boolean isChecked;
    ....

    public boolean isChecked() {
        return isChecked;
    }

    public void isChecked(boolean isChecked) {
        this.isChecked= isChecked;
    }
    .....
}

FormCoachingAdapter

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("");*/

        //Handle selection  state 
        if(question.isChecked){
            // 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{
             // not selected yet(default)
          }

        holder.rgCommon.setOnCheckedChangeListener((group, checkedId) -> {
            RadioButton rb = holder.itemView.findViewById(checkedId);

            //Handling selection state changed
            question.isChecked(true);


        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();
    }

}

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

...