列表视图无线电组错误 [英] listview with radio group error

查看:100
本文介绍了列表视图无线电组错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家我创建一个自定义列表视图动态单选按钮添加到RadioGroup中高达,我得到我想要什么,但是当我尝试选择在第一排一个单选按钮,然后在第5,第9个自动第一个按钮,13行是越来越选择当我选择第二行中的任何按钮,然后在第6相同的按钮,第8,第12行是越来越选择什么,我做错了,我的适配器类

 公共类InteractiveArrayAdapter扩展ArrayAdapter<型号:GT; {
字符串变量=活动;
私人最终名单,其中,型号>清单;
私人最终活动范围内;

公共InteractiveArrayAdapter(活动背景下,列表与LT;型号>列表){
    超(背景下,R.layout.rowbuttonlayout,清单);
    this.context =背景;
    this.list =清单;
}

静态类ViewHolder {
    受保护的TextView文本;
    保护复选框复选框,checkbox1;
    保护RadioGroup中mgroup首项;
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    Log.d(标签,3);
    查看查看= NULL;
    如果(convertView == NULL){
        LayoutInflater充气= context.getLayoutInflater();
        鉴于= inflator.inflate(R.layout.rowbuttonlayout,NULL);
        最后ViewHolder viewHolder =新ViewHolder();
        viewHolder.text =(TextView中)view.findViewById(R.id.label);
        //viewHolder.checkbox =(复选框)view.findViewById(R.id.check);
        //viewHolder.checkbox1 =(复选框)view.findViewById(R.id.checkbox1);
        viewHolder.mgroup =(RadioGroup中)view.findViewById(R.id.radioGroup1);
        最终单选[] mbutton =新单选[5];
           为(中间体升= 0;升小于5;升++){
               mbutton [1] =新的单选按钮(上下文);
               mbutton [升] .setText(测试+ 1);


               viewHolder.mgroup.addView(mbutton [升]);

           }
           viewHolder.mgroup.setOnCheckedChangeListener(新RadioGroup.OnCheckedChangeListener(){
               公共无效onCheckedChanged(RadioGroup中mRadioGroup,INT checkedId){
                    的for(int i = 0; I< mRadioGroup.getChildCount();我++){
                         单选按钮BTN =(单选)mRadioGroup.getChildAt(我);
                         // INT T = table.indexOfChild(table_row);
                         //System.out.println(t);
                         INT T = mRadioGroup.getId();
                         的System.out.println(T);

                         如果(btn.getId()== checkedId){
                              字符串文本= btn.getText()的toString()。
                              //做一些文字
                              Log.d(文字,EVENT1);
                              返回;
                         }
                    }
               }
          });


        view.setTag(viewHolder);
        Log.d(标签,我);

    } 其他 {
        鉴于= convertView;
        Log.d(标签,meeee);

    }
    ViewHolder支架=(ViewHolder)view.getTag();
    holder.text.setText(list.get(位置).getName());

    Log.d(标签,event7);

    返回查看;

}
 

}

我张贴我的工作code所以,这将是有益的给别人看看它

 公共类InteractiveArrayAdapter扩展ArrayAdapter<型号:GT;实现OnClickListener {
字符串变量=活动;
私人最终名单,其中,型号>清单;
私人最终活动范围内;
INT李,JH;



公共InteractiveArrayAdapter(活动背景下,列表与LT;型号>列表){
    超(背景下,R.layout.rowbuttonlayout,清单);
    this.context =背景;
    this.list =清单;
}

 静态类ViewHolder {
    受保护的TextView文本;
    保护复选框复选框,checkbox1;
    保护RadioGroup中mgroup首项;
    保护单选mbutton;
}



@覆盖
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
    //Log.d(tag,3);

     查看查看= NULL;
    如果(convertView == NULL){
        //System.out.println("ok);
        LayoutInflater充气= context.getLayoutInflater();
        鉴于= inflator.inflate(R.layout.rowbuttonlayout,NULL);
        最后ViewHolder viewHolder =新ViewHolder();
        viewHolder.text =(TextView中)view.findViewById(R.id.label);

        viewHolder.mgroup =(RadioGroup中)view.findViewById(R.id.radioGroup1);


        最终单选[] mbutton =新单选[5];
           为(中间体升= 0;升小于5;升++){
               mbutton [1] =新的单选按钮(上下文);
               mbutton [L] .setText(测试+ 1 +位置);
               mbutton [升] .setId(L + 1);
               mbutton [升] .setOnClickListener(新View.OnClickListener(){

                    @覆盖
                    公共无效的onClick(视图v){
                        // TODO自动生成方法存根
                        单选BYT =(单选)V;
                        byt.isChecked();
                        byt.getId();
                模型元素=(模型)viewHolder.mgroup.getTag();
                        element.setBte(byt.getId());
                            element.gte((字符串)viewHolder.text.getText());
                        的System.out.println(givemeresult);
                    }

                   });


               viewHolder.mgroup.addView(mbutton [升]);

               }
         view.setTag(viewHolder);
           viewHolder.mgroup.setTag(list.get(位置));


    } 其他 {
        鉴于= convertView;
        ((ViewHolder)view.getTag())mgroup.setTag(list.get(位置))。
        }
     ViewHolder支架=(ViewHolder)view.getTag();
     。view.getTag())mgroup.getTag();
     holder.text.setText(list.get(位置).getName());


    如果(list.get(位置).getName()== list.get(位置).done()){

        holder.mgroup.check(list.get(位置).isSelected());
    }
    其他 {

        holder.mgroup.clearCheck();
    }




    返回查看;

}
 

解决方案

这是因为观点被重用。你必须设置holder.mgroup中的其他人,如果(convertView == NULL)

ç有点被我改变了你的$ C $:

 公共类InteractiveArrayAdapter扩展ArrayAdapter<型号:GT; {
字符串变量=活动;
私人最终名单,其中,型号>清单;
私人最终活动范围内;

公共InteractiveArrayAdapter(活动背景下,列表与LT;型号>列表){
    超(背景下,R.layout.rowbuttonlayout,清单);
    this.context = context.getApplicationContext();
    this.list =清单;
}

静态类ViewHolder {
    受保护的TextView文本;
    保护复选框复选框,checkbox1;
    保护RadioGroup中mgroup首项;
}

@覆盖
公共查看getView(INT位置,查看convertView,ViewGroup中父){
    Log.d(标签,3);
    查看查看= convertView;
    ViewHolder viewHolder = NULL;
    最后的单选按钮[] mbutton = NULL;
    如果(查看== NULL){
        LayoutInflater充气= context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        鉴于= inflator.inflate(R.layout.rowbuttonlayout,NULL);
        viewHolder =新ViewHolder();
        viewHolder.text =(TextView中)view.findViewById(R.id.label);
        //viewHolder.checkbox =(复选框)view.findViewById(R.id.check);
        //viewHolder.checkbox1 =(复选框)view.findViewById(R.id.checkbox1);
        viewHolder.mgroup =(RadioGroup中)view.findViewById(R.id.radioGroup1);

        //我不知道这..
        // 开始
        mbutton =新单选[5];
       为(中间体升= 0;升小于5;升++){
           mbutton [1] =新的单选按钮(上下文);
           mbutton [升] .setText(测试+ 1);


           viewHolder.mgroup.addView(mbutton [升]);

        }

           viewHolder.mgroup.setOnCheckedChangeListener(新RadioGroup.OnCheckedChangeListener(){
               公共无效onCheckedChanged(RadioGroup中mRadioGroup,INT checkedId){
                    的for(int i = 0; I< mRadioGroup.getChildCount();我++){
                         单选按钮BTN =(单选)mRadioGroup.getChildAt(我);
                         // INT T = table.indexOfChild(table_row);
                         //System.out.println(t);
                         INT T = mRadioGroup.getId();
                         的System.out.println(T);

                         如果(btn.getId()== checkedId){
                              字符串文本= btn.getText()的toString()。
                              //做一些文字
                              Log.d(文字,EVENT1);
                              返回;
                         }
                    }
               }
          });
         // 结束

        view.setTag(viewHolder);
        Log.d(标签,我);

    } 其他 {
        viewHolder =(ViewHolder)convertView.getTag();

        // 开始
        mbutton = viewHolder.mgroup;
        // 结束

        Log.d(标签,meeee);

    }
    ViewHolder支架=(ViewHolder)view.getTag();
    holder.text.setText(list.get(位置).getName());

    Log.d(标签,event7);

    返回查看;

}
 

}

我实现了ImageView的的(剥离):

 公共类DealAdapter扩展ArrayAdapter< D​​ealObject> {

私人语境mContext;
私人活动mActivity;
私人的ArrayList< D​​ealObject> mItems;
私人诠释mXmlId;

公共DealAdapter(上下文的背景下,INT textViewResourceId,ArrayList的< D​​ealObject>的项目,活动活动){
    超(背景下,textViewResourceId,项目);
    this.mContext = context.getApplicationContext();
    this.mActivity =活动;
    this.mItems =项目;
    this.mXmlId = textViewResourceId;
}

@覆盖
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
    //视图V = NULL;
    视图V = convertView;
    ViewHolder支架=无效;
    RemoteImageLoader ImageLoader的=新RemoteImageLoader(mContext,真正的);
    RemoteImageView dealImage = NULL;

    DealObject月= mItems.get(位置);
    尝试 {
        如果(V == NULL){
            LayoutInflater VI =(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            V = vi.inflate(mXmlId,NULL);
            持有人=新ViewHolder();

            dealImage =(RemoteImageView)v.findViewById(R.id.deal_image);

            holder.dealImage = dealImage;
            v.setTag(保持器);
        } 其他 {
            //获取ViewHolder回得到快速访问ImageView的。
            支架=(ViewHolder)convertView.getTag();
            holder.dealImage.setBackgroundColor(Color.WHITE);
            dealImage = holder.dealImage;
        }

        如果(mo.getImage()!= NULL){
            //调用reset是显示在一个循环视图重要的是prevent旧图像。
            dealImage.reset();
            holder.dealImage.setImageUrl(IMAGEURL);
            尝试 {
                holder.dealImage.loadImage();
            }
            赶上(例外前){
            }
        }
    }
    赶上(例外前){
        ex.printStackTrace();
    }
    返回伏;
}

私有静态final类ViewHolder {
    私人RemoteImageView dealImage;
}
 

}

everybody i am creating a custom listview with dynamic radiobuttons adding to radiogroup upto that i am getting what i want but when i try to select one radio button in first row then automatically first button in 5th ,9th,13 row is getting selected and when i select any button in second row then same button in 6th,8th,12th row is getting selected what i am doing wrong here and my adapter class

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
String tag = "Events";
private final List<Model> list;
private final Activity context;

public InteractiveArrayAdapter(Activity context, List<Model> list) {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context;
    this.list = list;
}

static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox,checkbox1;
    protected RadioGroup mgroup;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d(tag," 3");
    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.rowbuttonlayout, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);
        //viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        //viewHolder.checkbox1 = (CheckBox) view.findViewById(R.id.checkbox1);
        viewHolder.mgroup = (RadioGroup) view.findViewById(R.id.radioGroup1);
        final RadioButton[] mbutton=new RadioButton[5];
           for(int l=0;l<5;l++){
               mbutton[l]=new RadioButton(context);
               mbutton[l].setText("test"+l);


               viewHolder.mgroup.addView(mbutton[l]);

           }
           viewHolder.mgroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
               public void onCheckedChanged(RadioGroup mRadioGroup, int checkedId) {
                    for(int i=0; i<mRadioGroup.getChildCount(); i++) {
                         RadioButton btn = (RadioButton) mRadioGroup.getChildAt(i);
                         //int t=table.indexOfChild(table_row);
                         //System.out.println(t);
                         int t=mRadioGroup.getId();
                         System.out.println(t);

                         if(btn.getId() == checkedId) {
                              String text = btn.getText().toString();
                              // do something with text
                              Log.d(text," event1");
                              return;
                         }
                    }
               }
          });


        view.setTag(viewHolder);
        Log.d(tag,"me");

    } else {
        view = convertView;
        Log.d(tag,"meeee");

    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());

    Log.d(tag," event7");

    return view;

}

}

i am posting my working code so that it will be helpfull to others have a look at it

public class InteractiveArrayAdapter extends ArrayAdapter<Model> implements OnClickListener {
String tag = "Events";
private final List<Model> list;
private final Activity context;
int li,jh;



public InteractiveArrayAdapter(Activity context, List<Model> list) {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context;
    this.list = list;
}

 static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox,checkbox1;
    protected RadioGroup mgroup;
    protected RadioButton mbutton;
}



@Override
public View getView( final int position, View convertView, ViewGroup parent) {
    //Log.d(tag," 3");

     View view =null;
    if (convertView == null) {
        //System.out.println("ok");
        LayoutInflater inflator = context.getLayoutInflater();
        view = inflator.inflate(R.layout.rowbuttonlayout, null);
        final ViewHolder viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);

        viewHolder.mgroup = (RadioGroup) view.findViewById(R.id.radioGroup1);


        final RadioButton[] mbutton=new RadioButton[5];
           for(int l=0;l<5;l++){
               mbutton[l]=new RadioButton(context);
               mbutton[l].setText("test"+l+position);
               mbutton[l].setId(l+1);
               mbutton[l].setOnClickListener(new View.OnClickListener(){

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        RadioButton byt=(RadioButton) v;
                        byt.isChecked();
                        byt.getId();
                Model element = (Model) viewHolder.mgroup.getTag();
                        element.setBte(byt.getId());
                            element.gte((String) viewHolder.text.getText());
                        System.out.println("givemeresult");
                    }

                   });


               viewHolder.mgroup.addView(mbutton[l]);

               }
         view.setTag(viewHolder);
           viewHolder.mgroup.setTag(list.get(position));


    } else {
        view = convertView;
        ((ViewHolder) view.getTag()).mgroup.setTag(list.get(position));
        }
     ViewHolder holder = (ViewHolder) view.getTag();
     view.getTag()).mgroup.getTag();
     holder.text.setText(list.get(position).getName());


    if (list.get(position).getName()==list.get(position).done()){

        holder.mgroup.check(list.get(position).isSelected());
    }
    else {

        holder.mgroup.clearCheck();
    }




    return view;

}

解决方案

That's because views are reused. You have to set holder.mgroup in the else of if(convertView == null)

Your code a bit changed by me:

public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
String tag = "Events";
private final List<Model> list;
private final Activity context;

public InteractiveArrayAdapter(Activity context, List<Model> list) {
    super(context, R.layout.rowbuttonlayout, list);
    this.context = context.getApplicationContext();
    this.list = list;
}

static class ViewHolder {
    protected TextView text;
    protected CheckBox checkbox,checkbox1;
    protected RadioGroup mgroup;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d(tag," 3");
    View view = convertView;
    ViewHolder viewHolder = null;
    final RadioButton[] mbutton = null;
    if (view == null) {
        LayoutInflater inflator = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflator.inflate(R.layout.rowbuttonlayout, null);
        viewHolder = new ViewHolder();
        viewHolder.text = (TextView) view.findViewById(R.id.label);
        //viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
        //viewHolder.checkbox1 = (CheckBox) view.findViewById(R.id.checkbox1);
        viewHolder.mgroup = (RadioGroup) view.findViewById(R.id.radioGroup1);

        // I'm not sure about this..
        // Begin
        mbutton=new RadioButton[5];
       for(int l=0;l<5;l++){
           mbutton[l]=new RadioButton(context);
           mbutton[l].setText("test"+l);


           viewHolder.mgroup.addView(mbutton[l]);

        }

           viewHolder.mgroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
               public void onCheckedChanged(RadioGroup mRadioGroup, int checkedId) {
                    for(int i=0; i<mRadioGroup.getChildCount(); i++) {
                         RadioButton btn = (RadioButton) mRadioGroup.getChildAt(i);
                         //int t=table.indexOfChild(table_row);
                         //System.out.println(t);
                         int t=mRadioGroup.getId();
                         System.out.println(t);

                         if(btn.getId() == checkedId) {
                              String text = btn.getText().toString();
                              // do something with text
                              Log.d(text," event1");
                              return;
                         }
                    }
               }
          });
         // End 

        view.setTag(viewHolder);
        Log.d(tag,"me");

    } else {
        viewHolder = (ViewHolder) convertView.getTag();

        // Begin
        mbutton = viewHolder.mgroup;
        // End

        Log.d(tag,"meeee");

    }
    ViewHolder holder = (ViewHolder) view.getTag();
    holder.text.setText(list.get(position).getName());

    Log.d(tag," event7");

    return view;

}

}

My implementation of an imageView (stripped):

public class DealAdapter extends ArrayAdapter<DealObject> {

private Context mContext;
private Activity mActivity;
private ArrayList<DealObject> mItems;
private int mXmlId;

public DealAdapter(Context context, int textViewResourceId, ArrayList<DealObject> items, Activity activity) {
    super(context, textViewResourceId, items);
    this.mContext = context.getApplicationContext();
    this.mActivity = activity;
    this.mItems = items;
    this.mXmlId = textViewResourceId;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    //View v = null;
    View v = convertView;
    ViewHolder holder = null;
    RemoteImageLoader imageLoader = new RemoteImageLoader(mContext, true);
    RemoteImageView dealImage = null;

    DealObject mo = mItems.get(position); 
    try { 
        if (v == null) { 
            LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(mXmlId, null);
            holder = new ViewHolder();

            dealImage = (RemoteImageView) v.findViewById(R.id.deal_image);

            holder.dealImage = dealImage;
            v.setTag(holder);
        } else {
            // Get the ViewHolder back to get fast access to the ImageView.
            holder = (ViewHolder) convertView.getTag();
            holder.dealImage.setBackgroundColor(Color.WHITE);
            dealImage = holder.dealImage;
        }

        if(mo.getImage() != null){ 
            // calling reset is important to prevent old images from displaying in a recycled view.
            dealImage.reset();
            holder.dealImage.setImageUrl(imageUrl);
            try {
                holder.dealImage.loadImage();
            }
            catch (Exception ex) {
            }
        }  
    }
    catch (Exception ex) { 
        ex.printStackTrace();
    }
    return v; 
} 

private static final class ViewHolder {
    private RemoteImageView dealImage;
}

}

这篇关于列表视图无线电组错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆