【问题标题】:Radio Group as item in listview custom adapter单选组作为列表视图自定义适配器中的项目
【发布时间】:2015-12-20 14:27:34
【问题描述】:

我制作了一个具有不同视图类型的自定义适配器。我正在展示两个视图,即具有可变按钮的 textview 和 radiogroup。我写了这段代码:

这是我用于不同视图的模型类

public class OrthoScaleModel {

    public static int SECONDARY_TEXTVIEW = 0;
    public static int RADIOGROUP_TEXTVIEW = 1;

    public int type;
    public String[] radioButtonArray;
    public String headingTitle;
    public int numberOfRadioButtons;

    public OrthoScaleModel(int type, String[] radioButtonArray, String headingTitle
    , int numberOfRadioButtons) {
        this.type = type;
        this.radioButtonArray = radioButtonArray;
        this.headingTitle = headingTitle;
        this.numberOfRadioButtons = numberOfRadioButtons;
    }
}

这是我的自定义适配器 getView() 方法代码

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;
    int type = getItemViewType(position);
    OrthoScaleModel model = list.get(position);

    for (String data : model.radioButtonArray){
        Log.v("Data", data);
    }

    RadioButton[] buttons = new RadioButton[model.numberOfRadioButtons];

    if (convertView == null){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        holder = new ViewHolder();

        if (type == 0){
            convertView = inflater.inflate(R.layout.secondary_heading, parent, false);
            holder.textView = (TextView) convertView.findViewById(R.id.secondaryHeadingTextView);
            convertView.setTag(holder);
        } else if (type == 1){
            convertView = inflater.inflate(R.layout.textview_radiogroup, parent, false);
            holder.radioGroup = (RadioGroup) convertView.findViewById(R.id.radio_group1);

            for (int i = 0; i < model.numberOfRadioButtons; i++){
                buttons[i] = new RadioButton(context);
                holder.radioGroup.addView(buttons[i]);
                buttons[i].setText(list.get(position).radioButtonArray[i]);
                buttons[i].setGravity(Gravity.TOP);
                buttons[i].setPadding(0, 5, 5, 0);
                buttons[i].setTextSize(18);
                convertView.setTag(holder);
            }
            convertView.setTag(holder);
        }
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if (type == 0){
        holder.textView.setText(model.headingTitle);
    }

    return convertView;
}

static class ViewHolder{
    private TextView textView;
    private RadioGroup radioGroup;
}

我用它来获取我的列表视图

  ListView listView = (ListView) findViewById(R.id.listView);
        String[] orthoScalesData = getResources().getStringArray(R.array.ortho_scales_data);
ArrayList<OrthoScaleModel> list1 = new ArrayList<>();
        list1.add(new OrthoScaleModel(OrthoScaleModel.SECONDARY_TEXTVIEW, new String[]{}, orthoScalesData[1], 0));

            list1.add(new OrthoScaleModel(OrthoScaleModel.SECONDARY_TEXTVIEW, new String[]{}, orthoScalesData[2], 0));
            list1.add(new OrthoScaleModel(OrthoScaleModel.RADIOGROUP_TEXTVIEW, new String[]{orthoScalesData[3],
                    orthoScalesData[4], orthoScalesData[5], orthoScalesData[6], orthoScalesData[7], orthoScalesData[8]},
                    " ", 6));

            list1.add(new OrthoScaleModel(OrthoScaleModel.SECONDARY_TEXTVIEW, new String[]{}, orthoScalesData[9], 0));
            list1.add(new OrthoScaleModel(OrthoScaleModel.RADIOGROUP_TEXTVIEW, new String[]{orthoScalesData[10],
                    orthoScalesData[11], orthoScalesData[12], orthoScalesData[13], orthoScalesData[14], orthoScalesData[15]},
                    " ", 6));

            CustomOrthoScaleAdapter adapter = new CustomOrthoScaleAdapter(this, list1);
            listView.setAdapter(adapter);

但是在我的列表视图中,两个单选组位置的单选按钮文本都相同。请有人帮忙。

【问题讨论】:

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


    【解决方案1】:

    在设置标签之前在for循环末尾添加holder.radioGroup.addView(buttons[i])

     for (int i = 0; i < model.numberOfRadioButtons; i++){
                    buttons[i] = new RadioButton(context);  
                    buttons[i].setText(list.get(position).radioButtonArray[i]);
                    buttons[i].setGravity(Gravity.TOP);
                    buttons[i].setPadding(0, 5, 5, 0);
                    buttons[i].setTextSize(18);
                    holder.radioGroup.addView(buttons[i]);
                    convertView.setTag(holder);
                }
    

    【讨论】:

      【解决方案2】:

      getView 方法的常见错误。首先,您应该获取 convertView,最后为它们设置内容。试试这个..

      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
      
          ViewHolder holder;
          int type = getItemViewType(position);
          OrthoScaleModel model = list.get(position);
      
          for (String data : model.radioButtonArray){
              Log.v("Data", data);
          }
      
          RadioButton[] buttons = new RadioButton[model.numberOfRadioButtons];
      
          if (convertView == null){
              LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              holder = new ViewHolder();
      
              if (type == 0){
                  convertView = inflater.inflate(R.layout.secondary_heading, parent, false);
                  holder.textView = (TextView) convertView.findViewById(R.id.secondaryHeadingTextView);
                  convertView.setTag(holder);
              } else if (type == 1){
                  convertView = inflater.inflate(R.layout.textview_radiogroup, parent, false);
                  holder.radioGroup = (RadioGroup) convertView.findViewById(R.id.radio_group1);
                  convertView.setTag(holder);
              }
          } else {
              holder = (ViewHolder) convertView.getTag();
          }
      ///Added///////////////////////////////
          if(holder.radioGroup!=null){
                  for (int i = 0; i < model.numberOfRadioButtons; i++){
                      buttons[i] = new RadioButton(context);
                      holder.radioGroup.addView(buttons[i]);
                      buttons[i].setText(list.get(position).radioButtonArray[i]);
                      buttons[i].setGravity(Gravity.TOP);
                      buttons[i].setPadding(0, 5, 5, 0);
                      buttons[i].setTextSize(18);
                      //convertView.setTag(holder);///not needed///
                  }
          }
      ///Added///////////////////////////////
          if (type == 0){
              holder.textView.setText(model.headingTitle);
          }
      
          return convertView;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        相关资源
        最近更新 更多