【问题标题】:listview with radio group error带有单选组错误的列表视图
【发布时间】:2015-08-07 00:16:54
【问题描述】:

我正在创建一个自定义列表视图,其中添加到 radiogroup 的动态单选按钮直到我得到我想要的,但是当我尝试在第一行中选择一个单选按钮时,然后自动选择第 5、9、13 行中的第一个按钮当我选择第二行中的任何按钮时,第 6、8、12 行中的相同按钮被选中我在这里做错了什么以及我的适配器类

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;

}

}

我正在发布我的工作代码,以便其他人查看它会有所帮助

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;

}

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    这是因为视图被重用。您必须在 if(convertView == null) 的 else 中设置 holder.mgroup

    你的代码被我修改了一点:

    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;
    
    }
    

    }

    我的 imageView 实现(剥离):

    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;
    }
    

    }

    【讨论】:

    • 对不起,我没听明白你能解释一下吗?因为我是这个平台的新手
    • 嗨,请任何人告诉我关于该 set holder.mgroup 的答案
    • 当然。视图在列表视图中被回收。请查看这篇文章以更好地理解mobile.cs.fsu.edu/?p=527。您应该在 "if(convertView == null)" 的 else {} 中设置 radiobutton.setChecked(true | false)
    • 感谢我正在处理的链接希望它能解决我的问题
    • 没问题,按照文章说的正确适配就可以解决了。对于列表视图中的前 4 行,convertView 将为空。对于接下来的行,convertView 不会为空,并将重用前 4 行。(我认为您的屏幕一次显示 4 行,对吗?)。如果你想每行有唯一的部分,你应该在 else {} 中设置它,因为 convertView 不为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2013-10-25
    相关资源
    最近更新 更多