2012-11-05 124 views
1

我想将复选框动态添加到LinearLayout。我已经使用了以下代码,android动态复选框

private class ListAdapters extends ArrayAdapter<ApplicationBean> { 
private ArrayList<ApplicationBean> items; 
private int position; 

public ListAdapters(Context context, int textViewResourceId, 
     ArrayList<ApplicationBean> mTitleList) { 
    super(context, textViewResourceId, mTitleList); 
    this.items = mTitleList; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    this.position = position; 
    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) mContext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.applicationlistitem, null); 
    } 

    final ApplicationBean o = (ApplicationBean) items.get(position); 

    if (o != null) { 

     txtAppName = (TextView) v.findViewById(R.id.app_name); 
     txtAppName.setText("" + o.getAppName()); 
     launchButton = (Button) v.findViewById(R.id.launch_btn); 
     launchButton.setTag(position); 
     launchButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       final PackageManager pm = mContext.getPackageManager(); 
       Intent LaunchIntent = pm 
         .getLaunchIntentForPackage(items 
           .get(Integer.parseInt(v.getTag() 
             .toString())).getPname()); 
       mContext.startActivity(LaunchIntent); 

      } 
     }); 

     rdgPassFail = (RadioGroup) v.findViewById(R.id.status_group); 
     rdgPassFail.setTag(position); 

     RadioButton passBtn = (RadioButton) v 
       .findViewById(R.id.pass_btn); 
     passBtn.setTag(position); 
     RadioButton failbtn = (RadioButton) v 
       .findViewById(R.id.fail_btn); 
     failbtn.setTag(position); 

     rdgPassFail 
       .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

        @Override 
        public void onCheckedChanged(RadioGroup group, 
          int checkedId) { 
         ApplicationBean o = (ApplicationBean) items 
           .get(Integer.parseInt(group.getTag() 
             .toString())); 

         switch (checkedId) { 
         case R.id.fail_btn: 
          Log.e("Fail button", "Clicked"); 
          o.setFailState(true); 
          o.setPassState(false); 
          numOptions = 0; 
          Log.e("Fail button--1", "Clicked"); 

          break; 
         case R.id.pass_btn: 
          Log.e("Pass button", "Clicked"); 

          o.setFailState(false); 
          o.setPassState(true); 
          Log.e("Pass button-----1", "Clicked"); 

          break; 
         } 
         items.set(Integer.parseInt(group.getTag() 
           .toString()), o); 
        } 

       }); 

      Log.i("checkBoxFlag", "checkBoxFlag not true " + position); 
      LinearLayout featuresTable = (LinearLayout) v 
        .findViewById(R.id.failure_reasonslist); 


      for (int i = 0; i <= 5; i++) { 
       CheckBox feature1 = new CheckBox(this.getContext()); 
       featuresTable.addView(feature1); 
       Log.i("Inside for loop", "creating check box " + position); 
      } 
      checkBoxFlag = true; 

     txtDescription = (EditText) v 
       .findViewById(R.id.description_text); 
     txtDescription.setTag(position); 
     if (txtDescription.isFocused()) { 
      InputMethodManager inputManager = (InputMethodManager) mContext 
        .getSystemService(INPUT_METHOD_SERVICE); 
      inputManager.restartInput(txtDescription); 
     } 

     txtDescription 
       .setOnFocusChangeListener(new View.OnFocusChangeListener() { 

        @Override 
        public void onFocusChange(View v, boolean hasFocus) { 
         if (!hasFocus) { 

          final EditText Caption = (EditText) v; 
          o.setDescription(Caption.getText() 
            .toString()); 

         } 

        } 
       }); 
     uninstallButton = (Button) v.findViewById(R.id.uninstall_btn); 
     uninstallButton.setTag(position); 
     // uninstallButton.setVisibility(View.INVISIBLE); 
     o.setUninstallVisible(false); 
     uninstallButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Uri packageUri = Uri.parse("package:" 
         + items.get(
           Integer.parseInt(v.getTag().toString())) 
           .getPname()); 
       Intent uninstallIntent = new Intent(
         Intent.ACTION_DELETE, packageUri); 
       uninstallIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(uninstallIntent); 
       mTitleList.remove(items.get((Integer) v.getTag())); 

       mListView.setAdapter(new ListAdapters(mContext, 
         R.id.app_name, mTitleList)); 
       ((BaseAdapter) mListView.getAdapter()) 
         .notifyDataSetChanged(); 
       isUninstallclicked = true; 

      } 
     }); 

     submitButton = (Button) v.findViewById(R.id.submit_btn); 
     submitButton.setTag(txtDescription); 
     submitButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       EditText tv = (EditText) v.getTag(); // get edittext 
                 // object 

       txtDescription = tv; 
       if (txtTesterName.getText().toString().equals("")) { 
        showDialog("Please enter the name of tester", 
          mContext); 
       } else if (numOptions == 0) { 
        showDialog("Please select failure reason", mContext); 
       } else if (tv.getText().toString().equals("")) { 
        showDialog("Please enter the description", mContext); 
       } else if (!isNetworkAvailable()) { 

        showDialog(
          "No network connection.Report won't be submitted", 
          mContext); 
       } else { 

        if (!o.isUninstallVisible()) { 
         uninstallButton.setVisibility(View.VISIBLE); 
         o.setUninstallVisible(true); 
         mListView.invalidate(); 
        } 
        PostRequest p = new PostRequest(Integer.parseInt(tv 
          .getTag().toString())); 
        p.execute(); 

       } 
      } 

     }); 

    } 
    return v; 
} 

@Override 
public int getItemViewType(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    // TODO Auto-generated method stub 
    return items.size(); 
} 

} 

根据代码,它应该是六个复选框应该在视图中。但是当我检查了六个以上的复选框时。请在下面找到日志(从logcat复制)。日志也来了两次。我在列表视图中有一些其他控件。这些是在布局xml中定义的。但是我不能在设计时限制这些复选框的数量。所以我正在尝试加载动态。有人可以帮忙吗?

10:40:23.163: I/Inside for loop(440): creating check box 0 
10:40:23.223: I/Inside for loop(440): creating check box 0 
10:40:23.223: I/Inside for loop(440): creating check box 0 
10:40:23.273: I/Inside for loop(440): creating check box 0 
10:40:23.273: I/Inside for loop(440): creating check box 0 
10:40:23.303: I/Inside for loop(440): creating check box 0 
10:40:23.393: I/c 
10:40:23.393: I/Inside for loop(440): creating check box 0 
10:40:23.423: I/Inside for loop(440): creating check box 0 
10:40:23.423: I/Inside for loop(440): creating check box 0 
10:40:23.503: I/Inside for loop(440): creating check box 0 
10:40:23.503: I/Inside for loop(440): creating check box 0 
10:40:23.553: I/Inside for loop(440): creating check box 0 
+2

这不是一个完整的源代码。看起来您发布的部分的方法会执行两次。检查你的代码。 –

+0

检查此。这是肯定帮助你:http://dj-android.blogspot.in/2012/04/milti-selection-listview-android-with.html –

+0

检查出我的答案... –

回答

8

你必须尝试创建动态复选框

int Array_Count=0; 
String[] Str_Array; 

Array_Count=Str_Array.length; 

LinearLayout my_layout = (LinearLayout)findViewById(R.id.my_layout); 

for (int i = 0; i < Array_Count; i++) 
{ 
    TableRow row =new TableRow(this); 
    row.setId(i); 
    row.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT)); 
    CheckBox checkBox = new CheckBox(this); 
    checkBox.setOnCheckedChangeListener(this); 
    checkBox.setId(i); 
    checkBox.setText(Str_Array[i]); 
    row.addView(checkBox); 
    my_layout.addView(row); 
} 
0

您已明确发布的代码仅添加了6个复选框。这意味着这些函数被调用的方法会被调用两次。

您正在某处登录I/C。第二次调用此方法是在该调用之后进行的,这给您一个开始寻找的地方。

2

做这样

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    LinearLayout ll = (LinearLayout)findViewById(R.id.linearLayout2); 

    //add checkboxes 
      for(int i = 0; i < 6; i++) { 
       CheckBox cb = new CheckBox(this); 
       cb.setText("Dynamic Checkbox " + i); 
       cb.setId(i+6); 
       ll.addView(cb); 
      } 
    } 
+0

我已编辑我的问题,并添加完整源代码。 – developerXXX

0

试试这个: -

CheckBox[] cb=new CheckBox[6]; 
for(int i = 0; i < 6; i++) { 
cb[i].setText("Dynamic Checkbox " + i); 
cb[i].setId(i+6); 
linearLayout.addView(cb[i]); 

} 
0

使用下面这段代码:

LinearLayout ll = (LinearLayout) findViewById(R.id.ll); 

     CheckBox[] cb = new CheckBox[6]; 
     for (int i = 0; i < 6; i++) { 
      cb[i] = new CheckBox(this); 
      ll.addView(cb[i]); 
      cb[i].setText("Dynamic Checkbox " + i); 
      cb[i].setId(i + 6); 

     }