2 qq 23303131 qq_23303131 于 2016.04.28 22:26 提问

listview复用两个viewholder,两个viewholder的成员变量是完全不一样的

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolderTop holderTop = null;
ViewHolderNotTop holderNotTop = null;
int state = post.getData().get(position).getState();
System.out.println("state: "+state);
if (convertView == null||!flag[0]||!flag[1]) {
switch (state) {
case 0:
holderNotTop = new ViewHolderNotTop();
convertView = inflater.inflate(R.layout.listviewitem_for_post,
null);
holderNotTop.tv_post_title = (TextView) convertView
.findViewById(R.id.tv_post_title);
holderNotTop.tv_postContent = (TextView) convertView
.findViewById(R.id.tv_postContent);
holderNotTop.tv_writePostTime = (TextView) convertView
.findViewById(R.id.tv_writePostTime);
holderNotTop.postCommentNumber = (TextView) convertView
.findViewById(R.id.postCommentNumber);
holderNotTop.girlview_photo = (GridView) convertView
.findViewById(R.id.girlview_photo);
initPost(position, holderNotTop.tv_post_title,
holderNotTop.tv_postContent,
holderNotTop.tv_writePostTime,
holderNotTop.postCommentNumber,
holderNotTop.girlview_photo);
if (!flag[1]) {
convertView.setTag(R.string.notTop,holderNotTop);
flag[1] = true;
}
break;
case 1:
holderTop = new ViewHolderTop();
convertView = inflater.inflate(
R.layout.listview_item_for_topcomment, null);
holderTop.tv_postTitle = (TextView) convertView
.findViewById(R.id.tv_postTitle);
holderTop.tv_postTitle.setText(post.getData().get(position)
.getTitle());
if (!flag[0]) {
convertView.setTag(R.string.istop,holderTop);
flag[0] = true;
}
break;
}
} else {// 不用实例控件
switch (state) {
case 0:
holderNotTop =(ViewHolderNotTop) convertView.getTag(R.string.notTop);
initPost(position, holderNotTop.tv_post_title,
holderNotTop.tv_postContent,
holderNotTop.tv_writePostTime,
holderNotTop.postCommentNumber,
holderNotTop.girlview_photo);

            break;
        case 1:
            holderTop = (ViewHolderTop) convertView.getTag(R.string.istop);
            holderTop.tv_postTitle.setText(post.getData().get(position)
                    .getTitle());
            break;
        }

    }
    return convertView;
}


class ViewHolderTop {
    TextView tv_postTitle;
}

class ViewHolderNotTop {
    TextView tv_post_title;
    TextView tv_postContent;
    TextView tv_writePostTime;
    TextView postCommentNumber;
    GridView girlview_photo;
}


现在我的问题好像是它们两个前面都复用了,但是当listview的item条数超过屏幕就好像像会刷新,就找不到一个标志了()holderTop = (ViewHolderTop) convertView.getTag(R.string.istop);
            holderTop.tv_postTitle.setText(post.getData().get(position)
                    .getTitle());的holderTop是获取出问题的,报空指针了,貌似之前没刷新时没这问题,是可以正常的获取到该viewholder对象的。  在网上查找的获取是convertview.setTag(int,Object)和convertview.getTag(int),因为尝试了setTag(Object)和getTag()貌似不行!!   请大牛们指点下,在这感谢了.....

3个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.04.28 23:06
已采纳
 如果listview中有多种布局,继承baseadapter,重写getItemViewType
 类似 http://www.tuicool.com/articles/jAFnMb
qq_34828924
qq_34828924   2016.04.29 00:26

如果listview中有多种布局,继承baseadapter,重写getItemViewType
类似 http://www.tuicool.com/articles/jAFnMb

qq_23303131
qq_23303131   2016.04.29 16:53
我就按先后顺序采纳哈  谢谢大家的热心解答
确实是跟getItemViewType(int position)方法和getViewTypeCount()方法有关,应该是跟适配器里面的机制有关
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
ListView的优化。contentView的复用和ViewHolder的使用
BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView、GridView、Gallery、Spinner等等。它是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,因为这会涉及到ListView优化等问题,其他的方法可以参考链接的文章。   BaseAdapt
解决ListView滚动复用convertview和ViewHolder数据填充错乱
我说下我的理解,最可能出现重复的情况就是getView(int position, View convertView, ViewGroup parent)中的convertview利用的情况,由于getview的时候,listview自身会复用已存在的item,即重用最先新建的那几个item,还有就是注意tag的使用,convertView.getTag()返回的也是重用的view,其状态是和被重
ListView的优化之复用convertView和利用ViewHolder
ListView的优化之复用convertView和利用ViewHolder
Android ListView适配器Adapter的使用,item的复用和ViewHolder优化
概述 数据适配器:由于数据源的多样性及ListView的固定数据格式,需要使用Adapter建立数据源和ListView的动态适配关系。Adapter解耦了数据的来源和显示,降低了程序的耦合性,使之更易扩展。 ListView的缓存机制:如需同时显示5条数据,滑动时最多会同时显示6条数据,因此系统将加载6个item布局。当向上滑动至第一个item不可见时,该item则进入缓存池。当第7
ListView的Adapter有多个ViewHolder的时候导致的ViewHolder类型转换错误!
问题复现 背景是这样的,我用的CursorAdapter,然后重写了getViewTypeCount方法 @Override public int getViewTypeCount() { return TYPE_COUNT; } 我又自己实现了一个getItemViewType方法 public int getItemViewType(Cursor
摆脱ViewHolder,一种无需ViewHolder的高效ListView写法
使用ListView来展示列表数据,基本上是每个Android猿必须掌握的技能,而ListView的基本优化技巧,基本也烂大街了,无非是复用convertView对象还有使用ViewHolder来缓存Item中各个子View的引用。 最近看到一篇文章,描述了一种非主流的高效的ListView写法,无需创建ViewHolder类和holder对象,不用setTag()和getTag(),感觉效率更
Android性能优化之Listview(ViewHolder重用机制)
相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了。 ListView优化主要有下面几个方面: 1、convertView重用 2、ViewHolder的子View复用 3、缓存数据复用 一、convertView重用 首先讲下ListView的原
Android Listview加载不同布局,ViewHolder类型转换异常!!!
ListView加载不同布局时,需要注意的是,不仅要重写getItemViewType()这个方法,还需要重写getViewTypeCount()方法,因为后者默认返回值为1,若补充些此方法,加载多种布局的时候就会爆出ViewHolder类型转换异常!切记
listView 利用viewholder进行优化
ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。 当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolde
ListView和ViewHolder的结合使用
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,使用ListView必须给他指定一个Adapter,这里我们使用BaseAdapter: 在布局文件中定义一个ListView activity_main.xml <?xml version="1.0" encoding="utf-8"