Как выбрать нет проверенной группы радио я RecyclerView? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть RecyclerView и 60 пунктов включают в себя RadioGroup и в RadioGroup У меня есть два RadioButton ... Я включаю «Слушатель» в RadioGroup, пока пользователь не проверит радиогруппу 60, покажу «закуска», чтобы сказать «нет, у вас нет разрешения перейти к следующему действию, пожалуйста, ответьте на все вопросы»! теперь мне нужно добавить еще один вариант, как это ... показать, что radioGroup не отмечен (например, изменение фона cardView или любая другая идея) ...

qustions_item_row.xml

<RadioGroup
    android:id="@+id/ques_radio_group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txt_ques_title"
    android:layout_gravity="end|center"
    android:gravity="start"
    android:orientation="vertical"
    android:textAlignment="textStart"
    android:textDirection="rtl">

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/first_ques"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="end|right"
        android:layout_margin="@dimen/quest_margin"
        android:checked="false"
        android:gravity="end|right"
        android:padding="@dimen/quest_padding"
        android:text="@{question.firstQuest}"
        android:textColor="@color/ques"
        android:textDirection="ltr"
        android:textSize="@dimen/text_ques"
        />

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/second_ques"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="end|right"
        android:layout_margin="@dimen/quest_margin"
        android:checked="false"
        android:gravity="end|right"
        android:padding="@dimen/quest_padding"
        android:text="@{question.secondQuest}"
        android:textColor="@color/ques"
        android:textDirection="ltr"
        android:textSize="@dimen/text_ques"
        />


</RadioGroup>

Полный код адаптера (MbtiQuestAdapter.java)

import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.List;



public class MbtiQuestAdapter extends RecyclerView.Adapter<MbtiQuestAdapter.MbtiQuestViewHolder> {

  private Context context;
  private List<Question> questionList;
  private LayoutInflater layoutInflater;
  private FloatingActionButton fabResult;
  private CoordinatorLayout coordinator;
  private int checkRadio = 0;
  private Snackbar snackbar;


  private static final String TAG = "MbtiQuestAdapter";

  public MbtiQuestAdapter(Context context, List<Question> questionList, FloatingActionButton fab, CoordinatorLayout coordinator) {
    this.context = context;
    this.questionList = questionList;
    this.fabResult = fab;
    this.coordinator = coordinator;
  }


  @NonNull
  @Override
  public MbtiQuestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (layoutInflater == null) {
      layoutInflater = LayoutInflater.from(context);
    }

    QuesItemRowBinding binding = DataBindingUtil.inflate(layoutInflater,
      R.layout.ques_item_row, parent, false);

    return new MbtiQuestViewHolder(binding);
  }

  @Override
  public void onBindViewHolder(@NonNull final MbtiQuestViewHolder holder, final int position) {
    holder.binding.setQuestion(questionList.get(position));


    holder.binding.quesRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (holder.binding.firstQues.isChecked() || holder.binding.secondQues.isChecked()) {
          checkRadio++;

        } else {
          snackbar = Snackbar.make(coordinator, R.string.choose_one_of_theme, Snackbar.LENGTH_INDEFINITE);
          snackbar.show();
        }
      }
    });


    if (fabResult != null) {

      fabResult.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View v) {
                                       if (checkRadio == 60) {
                                         context.startActivity(new Intent(context, ResultActivity.class));
                                         Log.i(TAG, "onClick: " + checkRadio);
                                       } else {
                                         snackbar = Snackbar.make(coordinator, R.string.check_all_ques_err, Snackbar.LENGTH_SHORT);
                                         snackbar.show();


                                       }
                                     }
                                   }

      );
    }


  }

  @Override
  public int getItemCount() {
    return questionList.size();
  }

  public class MbtiQuestViewHolder extends RecyclerView.ViewHolder {

    private QuesItemRowBinding binding;

    public MbtiQuestViewHolder(QuesItemRowBinding binding) {
      super(binding.getRoot());
      this.binding = binding;
    }
  }


}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Я использую привязку данных, и я решил это так:

  //Card background if Uncheck the question
  private void showHideErrorBackground(boolean show) {
    for (Question question : questions) {
      question.setShowErrorBackground(show);
    }
    mbtiQuestAdapter.notifyDataSetChanged();
  }

в My Layout.xml я установил app:cardBackgroundColor="@{question.showErrorBackground &amp;&amp; question.selectedId == 0 ? @color/card_bg : @android:color/transparent}" для просмотра карты

   <androidx.cardview.widget.CardView
            android:id="@+id/card_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:color/white"
            android:layoutDirection="rtl"
            android:textDirection="rtl"
            app:cardBackgroundColor="@{question.showErrorBackground &amp;&amp; question.selectedId == 0   ? @color/card_bg : @android:color/transparent}"
            app:cardCornerRadius="@dimen/card_radius"
            app:cardPreventCornerOverlap="true"
            app:cardUseCompatPadding="true">

и это мой вопрос. Java

public class Question extends BaseQuestion {

  private int selectedId;
  private boolean showErrorBackground;

 @Bindable
  public void setShowErrorBackground(boolean showErrorBackground) {
    this.showErrorBackground = showErrorBackground;
    notifyPropertyChanged(BR.showErrorBackground);
  }

 @Bindable
  public int getSelectedId() {
    return selectedId;
  }

  public void setSelectedId(int selectedId) {
    this.selectedId = selectedId;
    notifyPropertyChanged(BR.selectedId);
  }


  public boolean isShowErrorBackground() {
    return showErrorBackground;
  }


}

и BaseQuestion.java

public class BaseQuestion extends BaseObservable {
}

Это я решил мою проблему ... но я решил ее несколько раз назад, но забудьте об этом здесь ... Удачи

0 голосов
/ 06 сентября 2018

Итак, пошли, это полный код вашей цели

ObjectListItem.java

public class ObjectListItem {

private String itemTitle = "";
private boolean opt1, opt2, opt3;
private int selectedAnswerPosition = -1;
private boolean shine;

public String getItemTitle() {
    return itemTitle;
}

public void setItemTitle(String itemTitle) {
    this.itemTitle = itemTitle;
}

public boolean isOpt1() {
    return opt1;
}

public void setOpt1(boolean opt1) {
    this.opt1 = opt1;
    if (opt1) {
        setOpt2(false);
        setOpt3(false);
    }
}

public boolean isOpt2() {
    return opt2;
}

public void setOpt2(boolean opt2) {
    this.opt2 = opt2;
    if (opt2) {
        setOpt1(false);
        setOpt3(false);
    }
}

public boolean isOpt3() {
    return opt3;
}

public void setOpt3(boolean opt3) {
    this.opt3 = opt3;
    if (opt3) {
        setOpt1(false);
        setOpt2(false);
    }
}

public int getSelectedAnswerPosition() {
    return selectedAnswerPosition;
}

public void setSelectedAnswerPosition(int selectedAnswerPosition) {
    this.selectedAnswerPosition = selectedAnswerPosition;
}

public boolean isShine() {
    return shine;
}

public void setShine(boolean shine) {
    this.shine = shine;
}}

layout_list_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/root"
    android:layout_height="wrap_content"
    android:layout_marginEnd="7dp"
    android:layout_marginStart="7dp"
    android:layout_marginTop="7dp"
    android:background="#989898"
    android:orientation="vertical"
    android:padding="7dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="This is title" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/radioButton1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="Option 1" />

        <RadioButton
            android:id="@+id/radioButton2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="Option 2" />

        <RadioButton
            android:id="@+id/radioButton3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="Option 3" />

    </LinearLayout>

</LinearLayout>

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.listItemsViewHolder> {

private Context context;

private ArrayList<ObjectListItem> objectListItems;

private OnRadioItemClicked onRadioItemClicked;

public void setOnRadioItemClicked(OnRadioItemClicked onRadioItemClicked) {
    this.onRadioItemClicked = onRadioItemClicked;
}

public interface OnRadioItemClicked {
    void radioItemChecked(int itemPosition, int optNum);
}

public MyAdapter(Context context, ArrayList<ObjectListItem> objectListItems) {
    this.context = context;
    this.objectListItems = objectListItems;
}

@Override
public listItemsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.layout_list_item, parent, false);

    return new MyAdapter.listItemsViewHolder(itemView);
}

@Override
public void onBindViewHolder(final listItemsViewHolder holder, int position) {
    final ObjectListItem objectListItem = objectListItems.get(position);

    holder.title.setText("This is my awesome title " + position);
    holder.radioButton1.setChecked(objectListItem.isOpt1());
    holder.radioButton2.setChecked(objectListItem.isOpt2());
    holder.radioButton3.setChecked(objectListItem.isOpt3());

    if (objectListItem.isShine()) {
        holder.root.setBackgroundColor(ContextCompat.getColor(context, R.color.shine));
    } else {
        holder.root.setBackgroundColor(ContextCompat.getColor(context, R.color.normal));
    }
}

@Override
public int getItemCount() {
    return objectListItems.size();
}

public class listItemsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private LinearLayout root;
    private TextView title;
    private RadioButton radioButton1, radioButton2, radioButton3;

    public listItemsViewHolder(View itemView) {
        super(itemView);
        root = itemView.findViewById(R.id.root);
        title = itemView.findViewById(R.id.title);
        radioButton1 = itemView.findViewById(R.id.radioButton1);
        radioButton2 = itemView.findViewById(R.id.radioButton2);
        radioButton3 = itemView.findViewById(R.id.radioButton3);
        radioButton1.setOnClickListener(this);
        radioButton2.setOnClickListener(this);
        radioButton3.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.radioButton1:
                if (onRadioItemClicked != null)
                    onRadioItemClicked.radioItemChecked(getAdapterPosition(), 1);
                break;
            case R.id.radioButton2:
                if (onRadioItemClicked != null)
                    onRadioItemClicked.radioItemChecked(getAdapterPosition(), 2);
                break;
            case R.id.radioButton3:
                if (onRadioItemClicked != null)
                    onRadioItemClicked.radioItemChecked(getAdapterPosition(), 3);
                break;
        }
    }
}}

MainActivity.java

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <android.support.v7.widget.AppCompatButton
        android:id="@+id/button_check"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="Check Answers" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

MainActivity.java

    public class MainActivity extends AppCompatActivity implements MyAdapter.OnRadioItemClicked, View.OnClickListener {

    private MyAdapter myAdapter;

    private RecyclerView myRecyclerView;

    private LinearLayoutManager linearLayoutManager;

    private ArrayList<ObjectListItem> objectListItems;

    private Button buttonCheck;

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

        buttonCheck = findViewById(R.id.button_check);
        buttonCheck.setOnClickListener(this);
        myRecyclerView = findViewById(R.id.recyclerView);

        generateQuestions();
        myAdapter = new MyAdapter(this, objectListItems);
        myRecyclerView.setHasFixedSize(true);
        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        myAdapter.setOnRadioItemClicked(this);
        myRecyclerView.setLayoutManager(linearLayoutManager);
        myRecyclerView.setAdapter(myAdapter);
    }

    private void generateQuestions() {
        objectListItems = new ArrayList<>();

        for (int i = 0; i < 20; i++) {
            ObjectListItem objectListItem = new ObjectListItem();
            objectListItem.setItemTitle("This is my awesome title " + i);
            objectListItems.add(objectListItem);
        }
    }

    @Override
    public void radioItemChecked(int itemPosition, int optNum) {
        objectListItems.get(itemPosition).setSelectedAnswerPosition(optNum);
        objectListItems.get(itemPosition).setShine(false);
        switch (optNum) {
            case 1:
                objectListItems.get(itemPosition).setOpt1(true);
                break;

            case 2:
                objectListItems.get(itemPosition).setOpt2(true);
                break;

            case 3:
                objectListItems.get(itemPosition).setOpt3(true);
                break;
        }
        myAdapter.notifyDataSetChanged();
    }

    @Override
    public void onClick(View view) {
        int result = checkAnswers();
        if (result == -1) {
            Toast.makeText(MainActivity.this, "We Have All Anwers ;)", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(MainActivity.this, "Answer to this question (ISHAK) :|", Toast.LENGTH_SHORT).show();
            linearLayoutManager.smoothScrollToPosition(myRecyclerView, null, result);
            objectListItems.get(result).setShine(true);
            myAdapter.notifyDataSetChanged();
        }
    }

    private int checkAnswers() {
        for (int i = 0; i < objectListItems.size(); i++) {
            if (objectListItems.get(i).getSelectedAnswerPosition() == -1) {
                return i;
            }
        }
        return -1;
    }
}

enter image description here

Если пользователь нажимает кнопку «Проверить ответ», приложение автоматически переходит к первому неотвеченному вопросу и меняет его фон.

Полный код на my Github

счастливое кодирование;)

...