zoukankan      html  css  js  c++  java
  • Android开发ListView中含有checkBox或者Button时会遇到的难题

       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_itemnull);

                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;

       }

     

  • 相关阅读:
    ASP.NET中FileUpload中的代码怎么编写?
    JQuery EasyUI 根据数据动态生成datagrid,统计常用
    JQuery EasyUI window 用法
    jQuery EasyUI DataGrid 分页 FOR ASP.NET
    SQL server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    javascript 判断浏览器客户端
    Access, SQL Server, and Oracle数据类型的对应关系
    asp.net中的模态对话框
    [转]C++获取Windows时间的方法总结
    [转]Oracle开发与使用文章收藏
  • 原文地址:https://www.cnblogs.com/vicma/p/3463386.html
Copyright © 2011-2022 走看看