如何在Android中遍历ListView中每一行的复选框?

3

我有一个包含三个文本视图和一个复选框的应用程序,每行都放置在listview中。我想要点击按钮后,能够获取每个复选框的状态,并删除与所选复选框对应的行。(isChecked)复选框的一项。另外我的复选框是在XML文件中硬编码的。我已经搜索了很多但没有找到具体的解决方法。提前感谢您。下面是我的代码...

  public class recentcalllistultimate extends ListActivity implements OnClickListener {
            CheckBox cb;
            Button edit,done;

            ImageButton contacts;
            ListView lv;
            ListView lvultimate;
            listviewadapterultimate lvar;


            int[] uniqueid;
            String[] names;
            String[] types;
            ;
        RelativeLayout rl;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                // TODO Auto-generated method stub
                super.onCreate(savedInstanceState);

        LayoutParams params=newRelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
                LinearLayout mainLayout = new LinearLayout(this);
                mainLayout.setOrientation(LinearLayout.VERTICAL);
                LayoutInflater layoutInflater = getLayoutInflater();
                mainLayout.addView(layoutInflater.inflate(R.layout.listviewonly, null));
                mainLayout.addView(layoutInflater.inflate(R.layout.allbuttons, null));
                this.addContentView(mainLayout, params);

                cb = (CheckBox) findViewById(R.id.checkboxdelete);

                getContacts();

                lv = (ListView) findViewById(android.R.id.list);
                lvar = new listviewadapterultimate(this, names, types,uniqueid);
                lv.setAdapter(lvar);

                contacts = (ImageButton) findViewById(R.id.button_keypad);
                contacts.setOnClickListener(this);

                edit = (Button) findViewById(R.id.editbutton);
                done=(Button)findViewById(R.id.donebutton);

                done.setOnClickListener(new View.OnClickListener() {



    ------>>>                          public void onClick(View v) {
                        // TODO Auto-generated method stub
          cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView, booleanisChecked) {
                                // TODO Auto-generated method stub

                               //WHAT TO DO HERE....        

                                }

                            }
                        });
                    }
     ------>>>          });


    edit.setOnClickListener(new View.OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        AddDialog ada=new AddDialog(recentcalllistultimate.this);
                        ada.show();
                    }
                });

        }// on create

            public void getContacts() {

                ContentResolver cr = getContentResolver();

                Cursor cur = cr.query(android.provider.CallLog.Calls.CONTENT_URI, null,
                        null, null, null);

                if (cur.getCount() > 0) {
                    int i = 0;
                    int foo = 0;
                    names = new String[cur.getCount()];
                    types = new String[cur.getCount()];
                    duration = new long[cur.getCount()];
                    uniqueid = new int[cur.getCount()];

                    int n = cur.getColumnIndex(CallLog.Calls._ID);
                    int k = cur.getColumnIndex(CallLog.Calls.CACHED_NAME);
                    int y = cur.getColumnIndex(CallLog.Calls.NUMBER);
                    int z = cur.getColumnIndex(CallLog.Calls.CACHED_NUMBER_TYPE);


                    while (cur.moveToNext()) {

                        uniqueid[foo] = cur.getInt(n);

                        String str = cur.getString(k);

                        if (str == null) {
                            names[foo] = cur.getString(y);
                        }// if
                        else {
                            names[foo] = str;
                        }

                        int temp = cur.getInt(z);
                        switch (temp) {
                        case 0:
                            types[foo] = "unknown";
                            break;
                        case 1:
                            types[foo] = "home";
                            break;
                        case 2:
                            types[foo] = "mobile";
                            break;
                        case 3:
                            types[foo] = "work";
                            break;
                        }// switch

                        long doo = cur.getInt(d);
                        duration[foo] = doo;

                        foo++;

                    } // while
                }// if

            }//getcontacts

            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(v==contacts){
                Intent intent = new Intent();
                intent.setClassName("com.a.Activities",
                        "com.a.Activities.DialPad");
                startActivity(intent);
                finish();
                }
                }

     }// class
        .................................

        public class listviewadapterultimate extends BaseAdapter {
            viewHolder holder;

            Activity context;
            String[] names;
            String[] types;
            String[] duration;
            int[] uniqueid;


            public listviewadapterultimate(Activity context, String[] names,
                    String[] types, int[] uniqueid2 ) {
                this.context = context;
                this.names = names;
                this.types = types;

                uniqueid=uniqueid2;

            }




            public int getCount() {
                // TODO Auto-generated method stub
                return names.length;
            }

            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }

            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return 0;
            }

            public class viewHolder {
                TextView top;
                TextView bottom;

                TextView down;


            }

            public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub



                if (convertView == null) {
                    holder = new viewHolder();
                    LayoutInflater inflator = context.getLayoutInflater();
                    convertView = inflator.inflate(R.layout.recenttextviewonlyultimate, null);
                   holder.top = (TextView) convertView.findViewById(R.id.toptext_u);
                    holder.bottom = (TextView) convertView
                            .findViewById(R.id.bottomtext_u);

                holder.down = (TextView) convertView.findViewById(R.id.recentuniqueid_u);

                convertView.setTag(holder);

                } else {
                    holder = (viewHolder) convertView.getTag();
                    //holder.cb.setVisibility(View.VISIBLE);
                }

                holder.top.setText(names[position]);
                holder.bottom.setText(types[position]);

                holder.down.setText("" + uniqueid[position]);


                return convertView;
            }

        }
        ................

你能否发布你的代码,展示如何创建和维护视图? - Pratik
我正在查询sqllite数据库,并获取每个联系人的名称、类型和唯一行ID。 - prof_jack
如果您在这里编写您的代码,我们可以轻松地帮助您解决问题。 - Pratik
请查看此文章:http://www.vogella.de/articles/AndroidListView/article.html - Pratik
2个回答

1
尝试这样做:
在你的getView(...)方法内部...
 final CheckBox lChk = ((CheckBox) pConvertView.findViewById(R.id.myChkBoxID)); 
 private List<lisInfo> m_lisInfo = new ArrayList<lisInfo>();

 lChk.setOnCheckedChangeListener(new OnCheckedChangeListener() {
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
     // Populate the listInfo with check box status
     m_lisInfo.get(lPosition).setChkBoxStatus((isChecked));
  }
 });


 public class lisInfo{
   private boolean chkBoxStatus;

   public boolean isChkBoxStatus() {
        return chkBoxStatus;
    }

    public void setChkBoxStatus(boolean chkBoxStatus) {
        this.chkBoxStatus = chkBoxStatus;
    }
}

现在需要在必要的地方迭代listInfo以获取列表视图中复选框的状态。

我的复选框在布局文件中是硬编码到列表视图中的...我仍然可以使用这个getView方法吗? - prof_jack
为什么不行?检查一下我的代码,我正在从布局文件中获取复选框的ID。 - Vinayak Bevinakatti
在ListViewAdapterUltimate类中,我已经传递了名称、类型和uniqueid2。但我仍然无法将这三个参数绑定到我的复选框上,以便在复选框被选中时删除整行。此外,我想要一个按钮监听器,当按钮被选中时,我的列表视图的每一行都会被迭代,并且与选中复选框对应的行将被删除。我已经卡在这里一段时间了,任何帮助都将不胜感激。谢谢。 - prof_jack

0

在适配器内维护一个布尔数组。在getview中为复选框设置监听器,以便在选中/取消选中时切换数组的值。

现在在活动中使该数组可访问,在按钮上进行操作。

click()
{
for(int i=0;i<array.size;i++)
{
if(array[i])
adapter.deelet(item i);

//modify syntax
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接