自定义gridview的有关问题

自定义gridview的问题
自定义WordsGridView extends GridView
3行8列
继承BaseAdapater接口,getView()方法如下
                @Override
public View getView(int position, View v, ViewGroup parent) {
final WordButton holder;

if ( v == null ) {
v = Util.getView(context, R.layout.self_ui_gridview_item);

holder = mList.get(position);

holder.viewButton = (Button)v.findViewById(R.id.item_btn);
MyLog.i("ViewButton" + position+" Created", holder.viewButton.hashCode()+"");
                         } else {
holder = (WordButton)v.getTag();
}
但是结果第一个按钮0创建了两次
各种查找原因无结果,学校网络又连不上VPN,google上不了,特求助 android开发大神
自定义gridview的有关问题


------解决思路----------------------
补充下:
list是外界给这个adapter的数据,可以在构造方法中传递过来,也可以公开添加list的方法或添加单项的方法(方法中通常是list.add())。
------解决思路----------------------
引用:
你的代码逻辑有点乱。
首先你要知道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。

这位童鞋思路已经给你分析了,我再优化一下代码吧

//我不知道你这个WordButton定义了什么东西....一般写在Adapter里面的都是静态内部类,更能起到优化的效果
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