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

问题描述

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()貌似不行!!   请大牛们指点下,在这感谢了.....

解决方案

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

解决方案二:

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

解决方案三:

我就按先后顺序采纳哈  谢谢大家的热心解答
确实是跟getItemViewType(int position)方法和getViewTypeCount()方法有关,应该是跟适配器里面的机制有关
时间: 2024-11-02 00:03:26

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

JqueryMobile动态生成listView并实现刷新的两种方法

 本篇文章主要是对JqueryMobile动态生成listView并实现刷新的两种方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 JqueryMobile动态生成listView并实现刷新的两种方法   代码如下: function queryEntfernungen(tx, results)    alert("This Hello works");    var len = results.rows.length;      // This For works fin

JqueryMobile动态生成listView并实现刷新的两种方法_jquery

JqueryMobile动态生成listView并实现刷新的两种方法 复制代码 代码如下: function queryEntfernungen(tx, results)   alert("This Hello works");   var len = results.rows.length;     // This For works fine     for (var i = 0; i < len; i++) {       $("div[data-role=con

探究Android中ListView复用导致布局错乱的解决方案

首先来说一下具体的需求是什么样的: 需求如图所示,这里面有ABCD四个选项的题目,当点击A选项,如果A是正确的答案,则变成对勾的图案,如果是错误答案,则变成错误的图案,这里当时在写的时候觉得很简单,只要是在点击的时候判断我点击的选项与正确答案是否一样,是一样就将图片换成正确的样式,如果不一样就换成错误的样式,于是我便写了下面的代码(只贴出了核心Adapter中的代码) package com.fizzer.anbangproject_dahuo_test.Adapter; import andr

工程中采用两种框架两种编码格式出现乱码问题 求助

问题描述 工程中采用两种框架两种编码格式出现乱码问题 求助 工程中用到了两种框架 两种编码格式 出现乱码 不知道怎么处理

vc-VC 两个文件包涵同一个头文件 提示变量重定义

问题描述 VC 两个文件包涵同一个头文件 提示变量重定义 总共四个文件.分别是定义main函数的text.cpp定义了一个类 的 a.cpp和a.h还有一个b.h text.cpp代码 #include ""a.h"" #include ""b.h""int main(){ //some code} a.h代码 #pragma onceclass Ca{ //some code}; a.cpp代码 #include "

C#中说接口是让一个类有两个或两个以上基础类的唯一方法,这句话怎么解释,谢谢!

问题描述 C#中说接口是让一个类有两个或两个以上基础类的唯一方法,这句话怎么解释,谢谢!帮忙举个例子,谢谢! 解决方案 解决方案二:publicinterfaceI1{voidGetX();}publicinterfaceI2{voidGetY();}publicclassclass1:I1,I2{publicvoidGetX(){}publicvoidGetY(){}}解决方案三:我明白楼上说的意思但这种情况,并没有实现一个类有两个或两个以上基础类的情况呀?帮忙指教,谢谢解决方案四:I1,I2

一个页面中有两个textbow,两个gridview,如何让其一一对应

问题描述 一个页面中有两个textbow,两个gridview,两个butten按钮,如何在一个textbow中输入内容,在一个gridviw中显示查询内容,butten按钮的命令该如何写?能给的详细点吗? 解决方案 解决方案二:查询的命令不需要写,主要是一一对应的命令该如何写.解决方案三:怎么没人看,解决问题的可以给追加分!解决方案四:有两种选择.一.不写代码:用sqldatasource控件,使用textbox作为sqldatasource的select参数,直接拉控件绑定就可以了.二.手工

java线程问题-java线程类的作用是什么,目的是不是同时执行两个或两个以上的任务

问题描述 java线程类的作用是什么,目的是不是同时执行两个或两个以上的任务 java线程类的作用是什么,目的是不是同时执行两个或两个以上的任务 线程对象可以调用任意public方法吗 解决方案 你所写的主程序本身就是一个线程,称之为主线程,而线程类是用来执行一段很耗时,然后又不需要过多的干预的代码.比如说你要设计一个UI界面,界面上要有一个显示时间的时钟,这时你就可以自己设计一个线程,然后将时钟代码放到线程中,让其自主运行,而又不会影响UI界面上其它的操作.

java类的问题-问点java的基础常识,两个类定义的时候将对方作为自己的成员变量的好处在哪?

问题描述 问点java的基础常识,两个类定义的时候将对方作为自己的成员变量的好处在哪? 没学过java,但是又急着看一份java源码,碰到了一个我没办法理解的问题,就是在java定义了两个类,定义的时候两个个类将对方作为自己的成员变量,同时类可以引用对方的成员变量.这样做是很正常的吗?好处在哪里? 示例如下; class a { b XX; } class b { a XX; } 解决方案 这样做很正常.有时候需要将获得的一些属性封装到另一个类中,或者是需要用到另一个类的方法或者是属性.封装性,