Android开发ListView中含有checkBox或者Button时会遇到的难题

在Android开发中,ListView与CheckBox或Button结合时会遇到点击事件响应问题。解决方法包括:1) 设置子控件android:focusable="false"或使用android:descendantFocusability="blocksDescendants"避免焦点冲突;2) 记录选中CheckBox的位置,并在getView中设置状态,以防止滑动时错位;3) 给Button设置Tag,通过点击事件获取Tag来确定点击的position。

   android开发经常会遇到ListView中含有checkBox和Button的情况,这里主要会有三个问题,下面分别论述:

       1.         ListView中含有checkBox或者Button时,listView的item无法响应点击事件,这主要是因为checkBox和Button等获取焦点的能力高于listView,此时应该让其子控件不能获取焦点,即在布局文件中设置子控件属性android:focusable="false"或者在listView的adapter的布局中加入android:descendantFocusability="blocksDescendants"属性,descendantFocusability表示子控件均失去焦点。

       2.      ListView中含有checkBox时,选中CheckBox时,滑动listView会发现有多个选中的checkBox,即发生了错位,这个主要是与adapter的getView方法的机制有关系,即listView的每个界面都显示固定的item数,当滑动时,只是将前一屏的item重新绘制了一遍,这个可以先去了解下自定义adpter的getView的刷新机制。对于这个问题的解决办法是记录下选中的checkBox的位置(这个方法是当点击ListView的item时选中checkBox的前提),在getView中根据选中位置进行设置checkBox的状态。具体代码见下面:

         private List<String> selectPosition = newArrayList<String>();

 

         privateclass ListItems {

          CheckBox itemChechBox;

          TextView itemName;

        }

        @Override

         public View getView(int position, ViewconvertView, ViewGroup parent) {

       

        ListItemsitems = null;

        if (convertView == null) {

            items = new ListItems();

            convertView= mInflater.inflate(R.layout.upload_from_file_browser_item, null);

            items.itemChechBox =(CheckBox) convertView.findViewById(R.id.cb_choose_file);

            items.itemName = (TextView)convertView.findViewById(R.id.tv_upload_item);

            convertView.setTag(items);

        } else {

            items =(ListItems) convertView.getTag();

        }

        mListView.setOnItemClickListener(newOnItemClickListener() {

 

            @Override

            publicvoidonItemClick(AdapterView<?> arg0, View view, int position, long id) {

                ListItemsitem = (ListItems) view.getTag();

           

                    if (selectPosition.contains("" +position)) {

                             item.itemChechBox.setChecked(false);

                            selectPosition.remove("" +position);

                        }else {

                           selectPosition.add("" +position);      

                           item.itemChechBox.setChecked(true);

                              //记录选中的item的位置

                   

                    }});

               

 

               if (selectPosition.contains("" +position)) {

                    // 显示选中的checkBox

 

                      items.itemChechBox.setChecked(true);

              } else {

                     items.itemChechBox.setChecked(false);

              }

       

        }

 

           return convertView;

      }

 

 

3.      ListView中含有Button时,我们有时需要知道点击button位于listView的哪个position下,即要获取item的数据,由于button的click事件是异步的,无法得到点击的位置,这个原因与上面的checkBox类似,这时有一个办法是给button设置Tag,点击时获取tag来判断位置,实现代码如下:

   @Override

    public View getView(int position, ViewconvertView, ViewGroup parent) {

        ListHolderholder;

        if (convertView == null) {

            holder =new ListHolder();

            convertView= mInflater.inflate(R.layout.homework_list_item, null);

            holder.homeworkUpload =              (Button)convertView.findViewById(R.id.homework_list_btn_uploadhomework);

            convertView.setTag(holder);

        }else {

            holder =(ListHolder) convertView.getTag();

        }

 

            holder.homeworkUpload.setTag(position);

            holder.homeworkUpload.setOnClickListener(new OnClickListener(){

 

                @Override

                publicvoid onClick(View v) {

                 /**

                  * 上传家庭作业功能暂时屏蔽

                  */

                    Log.i("hubei", "click position:"+v.getTag());

Object homework = list.get(Integer.parseInt(""+v.getTag()));

                   

                   

                }

            });

 

        }

        return convertView;

   }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值