【问题标题】:Android radio group inside listview not working properly列表视图中的 Android 单选组无法正常工作
【发布时间】:2015-04-05 23:34:31
【问题描述】:

我是 android 新手,正在尝试创建一个问题列表视图,有 2 种类型,mcq 和 true-false, 除了问题文本视图和提交按钮之外,还有一个带有 4 个单选按钮的单选组,根据问题的类型,我隐藏了 2 个单选按钮,使它看起来像真假问题,直到这里一切正常。 ..

当我检查任何单选按钮并向下或向上滚动时出现问题,该按钮不会保留其状态,即使在存储选择了哪个选项之后,如果找到存储的选项,我检查单选按钮,但它没有显示签入 UI,而不是显示签入其他问题或有时选中不同的单选按钮..

这是我的适配器代码

public class QuestionAdapter extends BaseAdapter
{

    private ArrayList<QuestionsGetSet> data;
    private Context acontext;
    private LayoutInflater inflater;
    private String TAG="QuestionAdapter";

    public QuestionAdapter(Context a, ArrayList<QuestionsGetSet> q)
    {
        acontext = a;
        data = q;
    }

    @Override
    public int getCount()
    {
        return data.size();
    }

    @Override
    public Object getItem(int arg0)
    {
        return data.get(arg0);
    }

    @Override
    public long getItemId(int arg0)
    {
        return 0;
    }

    @Override
    public View getView(int arg0, View arg1, ViewGroup arg2)
    {
        holder hv=null;
        final int postion = arg0;
        if (arg1 == null)
        {
            inflater = (LayoutInflater) acontext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            arg1 = inflater.inflate(R.layout.question_feed, null);

            hv = new holder();
            hv.question = (TextView) arg1.findViewById(R.id.question_content_tv);
            hv.answer = (TextView) arg1.findViewById(R.id.question_answer_tv);
            hv.id = (TextView) arg1.findViewById(R.id.question_id_tv);
            hv.counter = (TextView) arg1.findViewById(R.id.question_counter_tv);
            hv.r_goup = (RadioGroup) arg1.findViewById(R.id.question_radio_group);
            hv.option1 = (RadioButton) arg1.findViewById(R.id.question_option_1);
            hv.option2 = (RadioButton) arg1.findViewById(R.id.question_option_2);
            hv.option3 = (RadioButton) arg1.findViewById(R.id.question_option_3);
            hv.option4 = (RadioButton) arg1.findViewById(R.id.question_option_4);
            hv.submit_btn = (Button) arg1.findViewById(R.id.question_submit_btn);
            hv.r_goup.setOnCheckedChangeListener(new OnCheckedChangeListener()
            {

                @Override
                public void onCheckedChanged(RadioGroup arg0, int arg1)
                {
                    Log.d(TAG,"inside oncheckedchanged, position="+postion);
                    data.get(postion).set_ischecked(true);
                    switch (arg1)
                    {
                    case R.id.question_option_1:
                        Log.d(TAG,"Option 1 checked");
                        data.get(postion).set_whichISchecked(1);
                        break;
                    case R.id.question_option_2:
                        Log.d(TAG,"Option 2 checked");
                        data.get(postion).set_whichISchecked(2);
                        break;
                    case R.id.question_option_3:
                        Log.d(TAG,"Option 3 checked");
                        data.get(postion).set_whichISchecked(3);
                        break;
                    case R.id.question_option_4:
                        Log.d(TAG,"Option 4 checked");
                        data.get(postion).set_whichISchecked(4);
                        break;
                    }
                }
            });
            arg1.setTag(hv);
        }
        else
        {
            hv = (holder) arg1.getTag();
        }

        QuestionsGetSet qgs = data.get(postion);
        if(qgs.get_ischecked())
        {
            Log.d(TAG,"inside if of is checked");
            int i=qgs.get_whichISchecked();
            Log.d(TAG,"inside if of is checked, which is check="+i);
            switch(i)
            {
            case 1:
                hv.option1.setChecked(true);
                hv.option2.setChecked(false);
                hv.option3.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 2:
                hv.option2.setChecked(true);
                hv.option1.setChecked(false);
                hv.option3.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 3:
                hv.option3.setChecked(true);
                hv.option1.setChecked(false);
                hv.option2.setChecked(false);
                hv.option4.setChecked(false);
                break;
            case 4:
                hv.option4.setChecked(true);
                hv.option1.setChecked(false);
                hv.option2.setChecked(false);
                hv.option3.setChecked(false);
                break;
            }
        }
        else if(!qgs.get_ischecked())
        {
            Log.d(TAG,"inside else of is checked");
            hv.option1.setChecked(false);
            hv.option2.setChecked(false);
            hv.option3.setChecked(false);
            hv.option4.setChecked(false);
        }


        /*** below all code is working fine  ***/

        /// used to create a true-false or mcq type ui, working fine
        if (qgs.get_isBool())
        {
            hv.option1.setText("True");
            hv.option2.setText("False");
            hv.option3.setVisibility(View.GONE);
            hv.option4.setVisibility(View.GONE);
        } else
        {
            hv.option1.setText(qgs.get_option_1());
            hv.option2.setText(qgs.get_option_2());
            hv.option3.setVisibility(View.VISIBLE);
            hv.option4.setVisibility(View.VISIBLE);
            hv.option3.setText(qgs.get_option_3());
            hv.option4.setText(qgs.get_option_4());
        }
        /// used to check if question can be submitted or not, working fine
        if (qgs.get_isvalid() != null)
        {
            if (!qgs.get_isvalid())
            {
                hv.submit_btn.setText("Question Closed");
                hv.submit_btn.setBackgroundResource(R.drawable.btn_invalid);
            } else
            {
                hv.submit_btn.setText("Submit");
                hv.submit_btn.setBackgroundResource(R.drawable.btn_valid);
            }
        }
        /// used to check if answer is present, then showed to user, working fine
        if (qgs.get_answer() != null)
        {
            hv.answer.setVisibility(View.VISIBLE);
            hv.answer.setText(qgs.get_answer());
        } else
        {
            hv.answer.setVisibility(View.GONE);
            hv.answer.setText("");
        }
        hv.question.setText(qgs.get_question());
        hv.id.setText(qgs.get_id() + "");
        hv.counter.setText(qgs.get_counter() + "");

        return arg1;
    }

    class holder
    {
        TextView question, answer, id, counter;
        Button submit_btn;
        RadioGroup r_goup;
        RadioButton option1, option2, option3, option4;
    }
}

这里是 QuestionGetSet 代码

public class QuestionsGetSet
{
    private String question,answer,option_1,option_2,option_3,option_4;
    private Boolean isBool=false,isvalid=false;
    private long id,counter;

    private Boolean isChecked=false;
    private int whichISchecked;

    public void set_ischecked(Boolean a)
    {
        this.isChecked=a;
    }
    public Boolean get_ischecked()
    {
        return this.isChecked;
    }
    public void set_whichISchecked(int a)
    {
        this.whichISchecked=a;
    }
    public int get_whichISchecked()
    {
        return this.whichISchecked;
    }


    public void set_question(String q)
    {
        this.question=q;
    }
    public String get_question()
    {
        return this.question;
    }
    public void set_answer(String q)
    {
        this.answer=q;
    }
    public String get_answer()
    {
        return this.answer;
    }
    public void set_option_1(String q)
    {
        this.option_1=q;
    }
    public String get_option_1()
    {
        return this.option_1;
    }
    public void set_option_2(String q)
    {
        this.option_2=q;
    }
    public String get_option_2()
    {
        return this.option_2;
    }
    public void set_option_3(String q)
    {
        this.option_3=q;
    }
    public String get_option_3()
    {
        return this.option_3;
    }
    public void set_option_4(String q)
    {
        this.option_4=q;
    }
    public String get_option_4()
    {
        return this.option_4;
    }

    public void set_isBool(Boolean q)
    {
        this.isBool=q;
    }
    public Boolean get_isBool()
    {
        return this.isBool;
    }
    public void set_isvalid(Boolean q)
    {
        this.isvalid=q;
    }
    public Boolean get_isvalid()
    {
        return this.isvalid;
    }

    public void set_id(long q)
    {
        this.id=q;
    }
    public long get_id()
    {
        return this.id;
    }
    public void set_counter(long q)
    {
        this.counter=q;
    }
    public long get_counter()
    {
        return this.counter;
    }
}

【问题讨论】:

    标签: android listview radio-button baseadapter radio-group


    【解决方案1】:

    在 QuestionAdapter 类中

    不使用 else if 条件只使用 else

    外汇

    替换

      else if(!qgs.get_ischecked())
    

      else 
    

    【讨论】:

    • 对不起兄弟,这不是正确的语法。 else 语句没有条件,即使只有“else”也不能解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多