问题
Ive been working on a simple app that has a feature where you can test your knowledge by answering multiple choice questions. After an answer is selected(by the radio button), i want to show either a check mark if the answer is correct, or an "X" if the answer is incorrect, to the right of the selected answer. For some reason, my code works perfectly for the first try, and then doesnt change anything when selecting other answers.
heres the code (its part of an adapter - child view)
/**
* Creates the View of group(parent) in the ExpandableListView
*
* @return the View of each parent in the List
*/
@Override
public View getGroupView(final int groupPosition, final boolean isExpanded, View convertView, final ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View parentView = inflater.inflate(R.layout.custom_list_parent, parent, false);
Question myQuestion = myList.get(groupPosition);
//setting the text of each parent
TextView singleTitle = (TextView) parentView.findViewById(R.id.title);
singleTitle.setText(myQuestion.getQuestion());
//handling the indicator
ImageView indicator = (ImageView) parentView.findViewById(R.id.indicator);
//if the list is expanded use arrow up, if not then use arrow down
int imageResourceId = isExpanded ? android.R.drawable.arrow_up_float : android.R.drawable.arrow_down_float;
//initial arrow
indicator.setImageResource(imageResourceId);
indicator.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/**
* Will expand and collapse groups depending on previous state
* @param v the View from which the ClickListener was triggered
*/
if (isExpanded) ((ExpandableListView) parent).collapseGroup(groupPosition);
else ((ExpandableListView) parent).expandGroup(groupPosition, true);
}
});
return parentView;
}
/**
* Creates the View of child in the ExpandableListView
* @return the View of each child in the List
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
final View childView = inflater.inflate(R.layout.custom_list_child_questions, parent, false);
handleRadioButtons(childView,groupPosition);
return childView;
}
/**
* Checks if the child can be selected/pressed as well
*
* @return whether the child is selectable or not
*/
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return false;
}
public void handleRadioButtons(View childView, int groupPosition) {
final Question myQuestion = myList.get(groupPosition);
RadioGroup group = (RadioGroup) childView.findViewById(R.id.buttonGroup);
initializeButtons(childView);
setButtonText(myQuestion);
//if one of the buttons is pressed
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
/**
* Will expand and collapse groups depending on previous state
* @param group the button group this ActionListener will operate on
* @param checkedId the ID of the individual button that was pressed
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//get the index of the correct answer
int indexAnswer = Integer.parseInt(myQuestion.getAnswer()) - 1;
for (int i = 0; i < possibleAnswers.length; i++) {
//if the button at position i was pressed
if (checkedId == possibleAnswers[i].getId()) {
//if its the correct answer
if (i == indexAnswer)
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.checkmark, 0);
else
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.wrong, 0);
} else {
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
}
}
}
});
}
/**
* Sets the text of each radio button as a possible answer
* @param myQuestion the Question corresponding to the possible answers
*/
public void setButtonText(Question myQuestion) {
for (int i = 0; i < possibleAnswers.length; i++) {
possibleAnswers[i].setText(myQuestion.getPossibleAnswers()[i]);
}
}
/**
* Initializes the RadioButton array of possible answers
* @param childView the View in which the radio buttons are defined
*/
public void initializeButtons(View childView) {
//array of radioButtons, each button will correspond to a possible answer
possibleAnswers[0] = (RadioButton) childView.findViewById(R.id.answer1);
possibleAnswers[1] = (RadioButton) childView.findViewById(R.id.answer2);
possibleAnswers[2] = (RadioButton) childView.findViewById(R.id.answer3);
possibleAnswers[3] = (RadioButton) childView.findViewById(R.id.answer4);
}
}
and the xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:background="#6495ED"
android:layout_width="match_parent"
android:layout_height="135dp">
<RadioGroup
android:id="@+id/buttonGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice1"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer1"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 2"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer2"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 3"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer3"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="choice 4"
android:drawablePadding="6dp"
android:textColor="#ffffff"
android:textSize="12dp"
android:id="@+id/answer4"
/>
</RadioGroup>
that's how the problem looks on the screen: problem
Any ideas? Please help!
EDIT:
here's what im doing now, trying to play with visibility:
public void handleRadioButtons(final View childView, int groupPosition) {
final Question myQuestion = myList.get(groupPosition);
RadioGroup group = (RadioGroup) childView.findViewById(R.id.buttonGroup);
initializeButtons(childView, myQuestion);
setButtonText(myQuestion);
//if one of the buttons is pressed
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
/**
* Will expand and collapse groups depending on previous state
*
* @param group the button group this ActionListener will operate on
* @param checkedId the ID of the individual button that was pressed
*/
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
//get the index of the correct answer
for (int i = 0; i < possibleAnswers.length; i++) {
//if the button at position i was pressed
if (checkedId == possibleAnswers[i].getId()) {
possibleAnswers[i].getCompoundDrawables()[2].setVisible(true,true);
}
}
}
});
}
/**
* Initializes the RadioButton array of possible answers
* @param childView the View in which the radio buttons are defined
*/
public void initializeButtons(View childView,Question myQuestion) {
//array of radioButtons, each button will correspond to a possible answer
possibleAnswers[0] = (RadioButton) childView.findViewById(R.id.answer1);
possibleAnswers[1] = (RadioButton) childView.findViewById(R.id.answer2);
possibleAnswers[2] = (RadioButton) childView.findViewById(R.id.answer3);
possibleAnswers[3] = (RadioButton) childView.findViewById(R.id.answer4);
for(int i=0;i<possibleAnswers.length;i++){
if(Integer.parseInt(myQuestion.getAnswer()) - 1 == i){
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.checkmark, 0);
possibleAnswers[i].getCompoundDrawables()[2].setVisible(false,true);
}
else{
possibleAnswers[i].setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.wrong, 0);
possibleAnswers[i].getCompoundDrawables()[2].setVisible(false,true);
}
}
}
回答1:
you can add an image beside every radiobutton, green check beside the correct answer and red X beside the wrong answer, make them all with setVisibility(GONE);
programatically, and when you want to show the correct answers just setVisibility(VISIBLE)
only for the correct answer and the chosen answer
来源:https://stackoverflow.com/questions/39339130/drawables-next-to-buttons