Динамически генерируемая радио-кнопка меняет свое положение при прокрутке

android listview android-listview radio-button dynamically-generated

483 просмотра

1 ответ

86 Репутация автора

Я динамически создал радио-кнопки. И они отображаются довольно хорошо, но когда я выбираю и прокручиваю, он теряет свою позицию. Я знаю способ установки и получения тега с помощью класса ViewHolder и преобразования представления. но на этот раз у меня есть динамические идентификаторы, поэтому я не могу пометить идентификатор. я пытался так

    converview.setTag(rdbtn.getId(),rdbtn);

Но это бросает The key must be an application specific Resource id.

Вот мой класс адаптера

      static class FeedBacksubmitionViewHolder {
    protected TextView Question;
    protected EditText Cooment;
    protected ViewGroup Radiogroup; 
    protected TextView Q;

}
public View getView(int position,View converview,ViewGroup parent) {
    FeedBacksubmitionViewHolder viewHolder = null;
    if (converview ==null ){
        LayoutInflater inflater=context.getLayoutInflater();
        converview=inflater.inflate(R.layout.listfeedbacksubmitionquestion, null,true);
        viewHolder = new FeedBacksubmitionViewHolder();

        viewHolder.Question = (TextView) converview.findViewById(R.id.tvFeedbacksubmitionquestion);
        viewHolder.Cooment = (EditText) converview.findViewById(R.id.edfeedbacksubmitioncomment);
        viewHolder.Radiogroup=((ViewGroup)converview. findViewById(R.id.radiogroup));
        viewHolder.Q =(TextView)converview.findViewById(R.id.feedba1);

        LinearLayout ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.VERTICAL);


        int number = feedBackSubmitionOptionList.size();

        //if(position!=feedBackSubmitionQuestionList.size()-1 || )
        for (int i = 0; i < number; i++) {
            //if(ll.getChildAt(0).getId()!=feedBackSubmitionOptionList.get(i).getId()){
            RadioButton rdbtn = new RadioButton(context);
            rdbtn.setId(feedBackSubmitionOptionList.get(i).getId());
            rdbtn.setText(feedBackSubmitionOptionList.get(i).getOptionLabel());
            ll.addView(rdbtn);
            converview.setTag(rdbtn.getId(),rdbtn);

            //}
        }





        converview.setTag(viewHolder);
        converview.setTag(R.id.tvFeedbacksubmitionquestion,viewHolder.Question);
        converview.setTag(R.id.edfeedbacksubmitioncomment,viewHolder.Cooment);
        converview.setTag(R.id.radiogroup,viewHolder.Radiogroup);
        converview.setTag(R.id.feedba1,viewHolder.Q);





        viewHolder.Radiogroup.addView(ll);


    }else{
        viewHolder= (FeedBacksubmitionViewHolder)converview.getTag();

    }
Автор: shivpal jodha Источник Размещён: 08.06.2015 11:38

Ответы (1)


1 плюс

2219 Репутация автора

В последние дни я боролся с этой проблемой, но работа над R & N позволила решить проблему. Вы можете сделать что-то вроде этого.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub// if(position==0)//Toast.makeText(context, ""+QuestionViewPageAdapter.mRadioGroupData, Toast.LENGTH_SHORT).show();

    final ViewHolder viewHolder;
    View row=convertView;

    radioButton=new RadioButton[Integer.parseInt(mNoOfCategoryGreading)]; LayoutInflater inflater =LayoutInflater.from(context);//(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.question_row, parent, false);

        viewHolder=new ViewHolder();

        viewHolder.tv_qContent=(TextView)row.findViewById(R.id.tv_question);
        viewHolder.rg=(RadioGroup)row.findViewById(R.id.rgrp);

        for(int i=0;i<Integer.parseInt(mNoOfCategoryGreading);i++)
        {
            radioButton[i]=new RadioButton(context);
            radioButton[i].setLayoutParams(new RadioGroup.LayoutParams(0, LayoutParams.WRAP_CONTENT,1f));
            //1f for layout_weight="1"
            radioButton[i].setId(i);
            radioButton[i].setText(""+(i+1));

            viewHolder.rg.addView(radioButton[i]);
        }
        row.setTag(viewHolder);


        for(int i=0;i<QuestionViewPageAdapter.mRadioGroupData.size();i++){
            int p=Integer.parseInt(""+QuestionViewPageAdapter.mRadioGroupData.get(i).get("position"));
            String id=QuestionViewPageAdapter.mRadioGroupData.get(i).get("Id");
            if(p!=-1 && id.equals(""+data.get(position).get(AppData.question_Set_category_QuestionID)))
            {//radioButton[p].setSelected(true);
                viewHolder.rg.check(p-1);}//Toast.makeText(context, "Yes "+p, Toast.LENGTH_LONG).show();}viewHolder.tv_qContent.setText((position+1)+". "+data.get(position).get(AppData.question_Set_category_QuestionContent));
    viewHolder.tv_qContent.setTypeface(typeface_muso_regular300);



    viewHolder.rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // TODO Auto-generated method stub

            String s=data.get(position).get(AppData.question_Set_category_QuestionID);
            isAvailabel(s);


                    int radioButtonID = viewHolder.rg.getCheckedRadioButtonId();
                    View radioButton = viewHolder.rg.findViewById(radioButtonID);
                    int idx = viewHolder.rg.indexOfChild(radioButton);
                    HashMap<String, String> map=new HashMap<String, String>();
                    map.put("position", ""+(idx+1));
                    map.put("Id", ""+data.get(position).get(AppData.question_Set_category_QuestionID));
                    map.put("CategoryId", ""+mCategoryId);
                    QuestionViewPageAdapter.mRadioGroupData.add(map);
            }


    });





    return row;
}

private void isAvailabel(String qId){

    for(int i=0;i<QuestionViewPageAdapter.mRadioGroupData.size();i++){
        if(qId.equals(QuestionViewPageAdapter.mRadioGroupData.get(i).get("Id"))){
            position=i;

            QuestionViewPageAdapter.mRadioGroupData.remove(i);
        }
    }

}

 class ViewHolder {
     TextView tv_qContent ,tv_1,tv_2,tv_3;
        RadioGroup rg;
        RadioButton rBtn1,rBtn2,rBtn3,rBtn4,rBtn5;
 }

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

Автор: Devendra Singh Размещён: 08.06.2015 06:14
Вопросы из категории :
32x32