解决方案 »

  1.   

    最好再贴点代码吧,目前没看出来。还有就是,最好打印出来数据,看看是不是正确,因为BaseAdapate的UI都是根据数据来的,这一点你代码里边也有体现。如果数据错了,UI肯定就有问题了。如果数据还没问题,就把更多代码贴出来,帮你看看吧。
      

  2.   

    你的代码逻辑有点乱。
    首先你要知道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。
      

  3.   

    补充下:
    list是外界给这个adapter的数据,可以在构造方法中传递过来,也可以公开添加list的方法或添加单项的方法(方法中通常是list.add())。
      

  4.   

    这位童鞋思路已经给你分析了,我再优化一下代码吧//我不知道你这个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