GridView第一个Item点击无反应

在写一个小项目的时候遇到一个好玩的问题。用GridView呈现24个Item。Item的布局就是一个Button,需求是每点击一个Item,这个Item就要消失。

GridView的Adapter的getView方法的部分代码如下:

public View getView(int position, ViewconvertView, ViewGroup parent) {
                          finalWord word = getItem(position);
                          Buttonbtn = null;
                          convertView= inflater.inflate(R.layout.word_item_layout, parent,false);
                          //…省略部分代码
                          btn= (Button) convertView.findViewById(R.id.bt_word_item);
                          btn.setText(word.getContent());
                          btn.setOnClickListener(newOnClickListener() {
                                   @Override
                                   public void onClick(View v) {
                                            if(listener!=null){
                                                    listener.onWordClick(word);
                                            }
                                   }
                          });
                          word.setButton(btn);
                          returnconvertView;
                  }


让按钮消失的具体逻辑写在了listener.onWordClick(word)中。写完之后运行,发现24个Item中的23个都正常,点击后消失,只有第一个点击后不消失!

为了测试,在listener.onWordClick(word);中添加了一个Toast输出一下,发现点击第一个按钮可以输出内容,但是就是不消失!于是在getView方法里面追加了一些Log输出,发现getView在返回24个Item视图的时候被调用了26次。其中第1次调用发生在position为0的时候,然后第2-25次发生在position从0-23,第26次调用又发生在position为0。也就是说,position为0的这个item被先后调用了3次!


通过做一些条件设定,让第一个item的Button监听器绑定分别发生只发生在第一次调用,第二次调用和第三次调用。它们的效果分别是:

第一次时绑定:点击Button无效,即不消失也不Toast,就像监听器完全没有绑定上

第二次时绑定:一切正常,即会消失也可以Toast。也就是,此时第一个Item点击的效果与其余23个Item是完全一致的,是正确的。

第三次时绑定:这是最奇葩的效果,可以Toast(说明绑定成功了)但是不能消失!

根据测试得到的结果,为Adapter添加了一个isFirst旗标,并且在getView方法中增加一个是否已经绑定了Button的判断:

public View getView(int position, ViewconvertView, ViewGroup parent) {
                          finalWord word = getItem(position);
                          Buttonbtn = null;
                          convertView= inflater.inflate(R.layout.word_item_layout, parent,false);
                          if(word.getButton()==null&& !isFirst){
                                   //省略部分代码…
                                   btn= (Button) convertView.findViewById(R.id.bt_word_item);
                                   btn.setText(word.getContent());
                                   btn.setOnClickListener(newOnClickListener() {
                                            @Override
                                            publicvoid onClick(View v) {
                                                     if(listener!=null){
                                                             listener.onWordClick(word);
                                                     }
                                            }
                                   });
                                   word.setButton(btn);
                          }
                          if(isFirst){isFirst= false;}
                          returnconvertView;
                  }


问题从现象上解决了,但是原因还得去扒一扒源码看一下。推测是与GridView中item尺寸的测量有关。虽然GridView和ListView使用起来在代码上的写法差不多,但是GridView呈现Item时的机制与ListView差别还是挺多的。本篇就算未完待续吧,找到具体原因后再继续更新。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值