自定义gridview的问题 android开发gridview继承BaseAdapterui 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最好再贴点代码吧,目前没看出来。还有就是,最好打印出来数据,看看是不是正确,因为BaseAdapate的UI都是根据数据来的,这一点你代码里边也有体现。如果数据错了,UI肯定就有问题了。如果数据还没问题,就把更多代码贴出来,帮你看看吧。 你的代码逻辑有点乱。首先你要知道final WordButton holder是什么意思,holder是为了优化gridview的getView并且可以重用没有被回收的view。holder包含了item的控件并且被赋相应数据值,然后被设置的view的tag上面返回给getView。如果view存在则通过getTag获取holder,然后赋值数据。你代码里面出现的问题是:a.数据如果是通过mList.get(position);获取,那么这句的位置就错了,应该在最上面,因为即使复用了回收的view,也需要赋值新的数据。b.holder用了,但是没有设置给view的tag。c.holder = (WordButton)v.getTag();在没有设置tag的情况下,没有走这段代码吗,不然可能会走空指针。当然我觉得你代码还是没有贴全,不然不太可能出现这么多问题。//按你的代码逻辑梳理下View resultView = null;final WordButton holder;String data = mList.get(position);//加入数据是Stringif ( v == null ) {resultView = Util.getView(context, R.layout.self_ui_gridview_item);holder = new WordButton();holder.viewButton = (Button)v.findViewById(R.id.item_btn);resultView.steTag(holder);MyLog.i("ViewButton" + position+" Created", holder.viewButton.hashCode()+""); } else {resultView = v;holder = (WordButton)resultView .getTag();}holder.viewButton.setText(data);思路是:1.如果有可以重用的view,那么通过tag获取holder;2.如果getView中参数的view为null,即没有可以重用的view,那么解析一个xml得到,然后给holder指定xml中的控件,最后将holder设置给view的tag,方便如果这个view消失在屏幕又可以重用时的使用(即1步骤)。3.不管是1还是2步骤获取到的holder,他们的数据需要填充或更新,所以这步骤是设置holder中控件的数据,数据基本上就是你继承BaserAdapter类中list中加入的数据,通过list.get(position)获取,这是要填充到控件上的数据,不是holder。 补充下:list是外界给这个adapter的数据,可以在构造方法中传递过来,也可以公开添加list的方法或添加单项的方法(方法中通常是list.add())。 这位童鞋思路已经给你分析了,我再优化一下代码吧//我不知道你这个WordButton定义了什么东西....一般写在Adapter里面的都是静态内部类,更能起到优化的效果final WordButton holder;String data = mList.get(position);//加入数据是Stringif ( v == null ) {v= Util.getView(context, R.layout.self_ui_gridview_item);holder = new WordButton();holder.viewButton = (Button)v.findViewById(R.id.item_btn);v.setTag(holder);MyLog.i("ViewButton" + position+" Created", holder.viewButton.hashCode()+""); } else {resultView = v;holder = (WordButton)resultView .getTag();}holder.viewButton.setText(data);return v;你可以后台打印一下你传进来的list 看看是不是传递了多余的item 开发一个监控系统碰到的问题,我能拿出的最高分求解 【求助】静态库链接失败问题,在线等,多谢啊 Android工程怎么导入 java.awt.Dimension 类? android 短信发送 Android ndk开发,cygwin环境iconv.h头文件问题 apk 无法在真机上运行。 andriod 和 android 的区别 小白发一个简单的问题 求教 关于activity启动service 求助,android studio无法连接手机 刚装的开发环境,新建项目一直出错 Android ListView的问题。
首先你要知道final WordButton holder是什么意思,holder是为了优化gridview的getView并且可以重用没有被回收的view。
holder包含了item的控件并且被赋相应数据值,然后被设置的view的tag上面返回给getView。如果view存在则通过getTag获取holder,然后赋值数据。你代码里面出现的问题是:
a.数据如果是通过mList.get(position);获取,那么这句的位置就错了,应该在最上面,因为即使复用了回收的view,也需要赋值新的数据。
b.holder用了,但是没有设置给view的tag。
c.holder = (WordButton)v.getTag();在没有设置tag的情况下,没有走这段代码吗,不然可能会走空指针。
当然我觉得你代码还是没有贴全,不然不太可能出现这么多问题。
//按你的代码逻辑梳理下
View resultView = null;
final WordButton holder;
String data = mList.get(position);//加入数据是String
if ( v == null ) {
resultView = Util.getView(context, R.layout.self_ui_gridview_item);
holder = new WordButton();
holder.viewButton = (Button)v.findViewById(R.id.item_btn);
resultView.steTag(holder);
MyLog.i("ViewButton" + position+" Created", holder.viewButton.hashCode()+"");
} else {
resultView = v;
holder = (WordButton)resultView .getTag();
}
holder.viewButton.setText(data);思路是:
1.如果有可以重用的view,那么通过tag获取holder;
2.如果getView中参数的view为null,即没有可以重用的view,那么解析一个xml得到,然后给holder指定xml中的控件,最后将holder设置给view的tag,方便如果这个view消失在屏幕又可以重用时的使用(即1步骤)。
3.不管是1还是2步骤获取到的holder,他们的数据需要填充或更新,所以这步骤是设置holder中控件的数据,数据基本上就是你继承BaserAdapter类中list中加入的数据,通过list.get(position)获取,这是要填充到控件上的数据,不是holder。
list是外界给这个adapter的数据,可以在构造方法中传递过来,也可以公开添加list的方法或添加单项的方法(方法中通常是list.add())。
final WordButton holder;
String data = mList.get(position);//加入数据是String
if ( v == null ) {
v= Util.getView(context, R.layout.self_ui_gridview_item);
holder = new WordButton();
holder.viewButton = (Button)v.findViewById(R.id.item_btn);
v.setTag(holder);
MyLog.i("ViewButton" + position+" Created", holder.viewButton.hashCode()+"");
} else {
resultView = v;
holder = (WordButton)resultView .getTag();
}
holder.viewButton.setText(data);
return v;
你可以后台打印一下你传进来的list 看看是不是传递了多余的item