3

我正在我的应用程序中动态添加一个复选框,并且我想删除已检查的记录。但是,我没有得到复选框的 ID。我怎样才能做到这一点?

代码:

package com.my.StudentInfoManagement;


public class ListData extends Activity{

    DataHelper dh;
    TableLayout tb;
    CheckBox[] ch=new CheckBox[50];
    EditText ed;
    int a[]=new int[50];
    int k=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listdataxml);
        dh=new DataHelper(this);
        System.out.println("in list data");
        List<String> names= this.dh.selectAll();
        ed=(EditText) findViewById(R.id.ed_id);
        tb=(TableLayout) findViewById(R.id.table);
        int i,j=1;
        TextView name1 = null,id,dob,gender,branch,email,address,mobile;
        String name11,id1 = null,dob1,gender1,branch1,email1,address1,mobile1;
        TableRow tr=new TableRow(this);

        tr.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
        TextView tv=new TextView(this);

        String c = null;
        String data[]=new String[50];

        int cnt=0;
        for(String name:names)
            {       
                if((!name.equals("-999")))
                {
                    data[cnt]=name;
                    cnt++;
                    System.out.println("........."+name);
                }
                else
                {
                    cnt=0;
                    name1=new TextView(this);
                    name1.setText(data[1]+" ");
                    id=new TextView(this);
                    id.setText(data[0]+" ");
                    System.out.println("ID is...."+data[0]);
                    dob=new TextView(this);
                    dob.setText(data[3]+" ");
                    gender=new TextView(this);
                    gender.setText(data[2]+" ");
                    branch=new TextView(this);
                    branch.setText(data[4]+" ");
                    mobile=new TextView(this);
                    mobile.setText(data[5]+" ");
                    email=new TextView(this);
                    email.setText(data[6]+" ");
                    address=new TextView(this);
                    address.setText(data[7]+" ");

                    tr=new TableRow(this);
                    tr.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

                    ch[k]=new CheckBox(this);
                    System.out.println("sysout");

                    i=Integer.parseInt(data[0]);
                    ch[k].setId(i);

                    tr.addView(ch[k]);
                    a[k++]=i;

                    tr.addView(id);
                    tr.addView(name1);
                    tr.addView(dob);
                    tr.addView(gender);
                    tr.addView(branch);
                    tr.addView(mobile);
                    tr.addView(email);
                    tr.addView(address);
                tb.addView(tr,new TableLayout.LayoutParams(                         LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
                    j++;
                    System.out.println("count"+j);  
                }
            }
    }

    public void delete(View v){
        System.out.println("In delete");
        int bb=k,id ;
         for (int i=0; i <k; i++) 
        {
             final int j = a[i];
             System.out.println("in for loop"+j);

                ch[j].setOnCheckedChangeListener(new OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
                        System.out.println("Checked ID :: " + ch[j].getId());
                    }
                });
            }
        System.out.println("00000000000000000..."+id);
        dh.deleteData(id);

    }
}
4

2 回答 2

3

强文本只需取一个全局变量

int chkId = 1001;

然后在动态添加 CheckBox 时,将其 id 设置为

ch.setId(++chkId);

然后在删除 CheckBox 时,您可以通过使用简单地获取 Checked CheckBox 的 id

getId()

方法

请参阅以下演示:

public class ChkBoxesActivity extends Activity {
    int chId = 1000;
    int chPos = -1;

    LinearLayout ll;
    String[] names = {"Tom", "Dick", "Keanu", "Harry", "Katrina", "Peter", "Julia", "Emma"};
    CheckBox[] ch;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ll = (LinearLayout) findViewById(R.id.ll);
        ch = new CheckBox[names.length];

        for(int i=0; i<names.length; i++) {
            ch[i] = new CheckBox(this);
            ch[i].setId(chId++);
            System.out.println("CHID :: "+chId);
            System.out.println("I :: "+i);
            ch[i].setText(names[i]);
            ll.addView(ch[i]);
        }

        for (int i = 0; i < names.length; i++) {
            final int j = i;
            ch[j].setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    System.out.println("Checked ID :: " + ch[j].getId());
                }
            });
        }
    }
}
于 2012-07-05T17:38:58.537 回答
2

在您专门设置它们之前,动态添加的视图没有 ID。因此,当您添加到布局时,您需要在视图上调用 view.setId(),否则您将无法使用 view.getId() 来引用它。

不久前,我在尝试动态创建 RelativeLayout 并相对于彼此定位内部视图时遇到了类似的问题;他们不会调整他们应该有的方式,因为在我明确为他们设置 ID 之前,ID 并不存在。

另外,你为什么这样做:

ch.getId();
ch.setId(1);

这完全没有意义。把它拿出来。

此外,您还需要一个将 CheckBox 链接到要删除的视图的参考。在这种情况下,我将创建一个新的 ArrayList 对象,其中包含一个 CheckBox 和一个 View,即 IE。

public Class MyRow{        
    CheckBox c;
    View v;

    public MyRow() {   }        
}

然后在动态添加视图时,将它们添加到 MyRow 或任何类中,然后将该类添加到 ArrayList 中,然后繁荣,您现在在它们之间有了引用,并且可以删除正确的引用。

于 2012-07-05T17:43:21.960 回答