android listview 中button 冲突问题,不同情况不同解决方案

本文详细介绍了在Android中ListView与内部Button事件冲突的三种情况及其解决方案,包括仅响应ListView事件、仅响应Button事件以及同时响应两者事件的实现方法,并提供了相关代码示例和XML配置建议。

主题:

Listview与button共同 存在事件?

1 问题描述:

用户需求不同,要的结果也不同。大致有三种情况:1)想要listview的事件。2)想要listview中的button事件。3)想要两个事件都有。

2 知识准备:

1)  关于重写listview。BaseAdapter,或者是SimpleAdapter。其中getView方法的正确理解。

继承自BaseAdapter的:(有button事件)

public ViewgetView(final int position, View convertView, ViewGroup parent) {

                     ViewHolder holder = null;

                    if (convertView == null) {

                             holder=newViewHolder(); 

                            

                             //可以理解为从vlist获取view  之后把view返回给ListView

                            

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

                             holder.title =(TextView)convertView.findViewById(R.id.sms_list_item_contractid);

                             holder.info =(TextView)convertView.findViewById(R.id.sms_list_item_receivetime);

                             holder.viewBtn =(Button)convertView.findViewById(R.id.sms_list_but_sendsms);

                             convertView.setTag(holder);                              

                    }else {                                  

                             holder =(ViewHolder)convertView.getTag();

                    }                

                   

                    holder.title.setText((String)mData.get(position).get("title"));

                    holder.info.setText((String)mData.get(position).get("info"));

                    holder.viewBtn.setTag(position);

                    //给Button添加单击事件  添加Button之后ListView将失去焦点  需要的直接把Button的焦点去掉

                    holder.viewBtn.setOnClickListener(newView.OnClickListener() {

                            

                             @Override

                             public voidonClick(View v) {

                                       showInfo(position);                                     

                             }

                    });

                   

                    //holder.viewBtn.setOnClickListener(MyListener(position));

                                      

                    return convertView;

           }

继承自SimpleAdapter的:

重写的时候(必须重写getVeiw),必须将列表视图操作全部写在里边。

      mData=this.getData();

                   String[]from={ "title","info"};

                   int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};          

           MyAdapter saImageItems_all = new MyAdapter(this,users_all,R.layout.vlist,from,to);

如果不重写,可以不用getView的方法。

mData=this.getData();

                   String[]from={ "title","info"};

                   int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};          

 

SimpleAdapter saImageItems_all = newSimpleAdapter(this,users_all,R.layout.sms_listview_item_layout,from,to);        

2)  正确理解ViewHolder.

    ViewHolder缓存了view中显示数据的子控件,View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断 ,view的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,之后就用View.getTag()方法来获得ViewHolder对象。

 引用自:http://blog.youkuaiyun.com/jacman/article/details/7087995

3)  影响listview中button事件的主要问题在哪。

   http://www.cnblogs.com/eyu8874521/archive/2012/10/17/2727882.html

   主要讲了不同参数设置,在此不多说。

即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”

3 不同需求

1)  只想要listview事件,屏蔽掉里边的button事件。

方案:可以在重写方法上屏蔽掉button的处理事件。或者不用getView的方法重写。也可以代码不修改,直接在xml文件中修改。

 目前只实现了屏蔽掉button事件处理的方法,对于xml方法,

Xml中设置:android:descendantFocusability="blocksDescendants",button事件仍然可以点击,不知道为什么,希望知道的朋友可以分享一下经验。

SampleAdapter可以不用重写getview,处理如下。

    public void initDateItemListener(intnum){

                   mData=this.getData();

                   String[]from={ "title","info"};

                   int[]to={R.id.sms_list_item_contractid, R.id.sms_list_item_receivetime};          

                   //MyAdaptersaImageItems_all = new MyAdapter(this,users_all,R.layout.vlist,from,to);

                   SimpleAdaptersaImageItems_all = new SimpleAdapter(this,users_all,R.layout.vlist,from,to);  

                   lv.setAdapter(saImageItems_all); 

     //添加点击 

                   lv.setOnItemClickListener(newOnItemClickListener() { 

          @Override 

          public voidonItemClick(AdapterView<?> arg0, View arg1, int arg2, 

                  long arg3) { 

                   showInfoItem(arg2);

          } 

     });

2)  只想要里边的button事件,屏蔽掉listview的事件处理。

方法一:可以直接在xml中进行设置,

去掉:android:descendantFocusability="blocksDescendants"

或者改成:android:descendantFocusability="afterDescendants"

方法二:代码修改,不用写item的点击事件,

  //添加点击 

                   lv.setOnItemClickListener(newOnItemClickListener() { 

          @Override 

          public voidonItemClick(AdapterView<?> arg0, View arg1, int arg2, 

                  long arg3) { 

                   showInfoItem(arg2);

          } 

      });

也是可以的。

BaseAdapter测试通过。

SimpleAdapter测试通过。

3)  两个都需要

首先,在listview的跟地址设置android:descendantFocusability="blocksDescendants"

然后只要接口在,就可以实现。

BaseAdapter测试通过。

SimpleAdapter测试通过。

4 代码下载地址:

   http://download.youkuaiyun.com/detail/self_discipline1/7339427

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值