关于convertView复用的问题

解析数据一共有两种,有一种带图片有一种不带图片,故用了两套布局,流程和正常ListView加载多套布局一样复用convertView然后setTag,但是一运行就会出错,详见下面:

Adapter中getView方法代码如下:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = list.get(position).getType();
ViewHolder3 vh3 = null;
ViewHolder vh = null;
Picasso p = Picasso.with(context);
if (convertView == null) {
switch (type) {
case 0:
convertView = LayoutInflater.from(context).inflate(R.layout.item_social_lv_noimage, null);
vh = new ViewHolder();
vh.iv_head = (ImageView) convertView.findViewById(R.id.iv_item_no_head);
vh.tv_name = (TextView) convertView.findViewById(R.id.tv_item_no_name);
vh.tv_date = (TextView) convertView.findViewById(R.id.tv_item_no_date);
vh.tv_detail = (TextView) convertView.findViewById(R.id.tv_item_no_detail);
vh.tv_theme = (TextView) convertView.findViewById(R.id.tv_item_no_theme);
vh.tv_eye = (TextView) convertView.findViewById(R.id.tv_item_no_eye);
vh.tv_comments = (TextView) convertView.findViewById(R.id.tv_item_no_comments);
vh.tv_good = (TextView) convertView.findViewById(R.id.tv_item_no_good);
convertView.setTag(vh);
break;
case 1:
convertView = LayoutInflater.from(context).inflate(R.layout.item_social_lv_oneimage, null);
vh3 = new ViewHolder3();
vh3.iv_head = (ImageView) convertView.findViewById(R.id.iv_item_one_head);
vh3.iv_main1 = (ImageView) convertView.findViewById(R.id.iv_item_one_main);
vh3.tv_name = (TextView) convertView.findViewById(R.id.tv_item_one_name);
vh3.tv_date = (TextView) convertView.findViewById(R.id.tv_item_one_date);
vh3.tv_detail = (TextView) convertView.findViewById(R.id.tv_item_one_detail);
vh3.tv_theme = (TextView) convertView.findViewById(R.id.tv_item_one_theme);
vh3.tv_eye = (TextView) convertView.findViewById(R.id.tv_item_one_eye);
vh3.tv_comments = (TextView) convertView.findViewById(R.id.tv_item_one_comments);
vh3.tv_good = (TextView) convertView.findViewById(R.id.tv_item_one_good);
convertView.setTag(vh3);
break;
default:
break;
}
} else {
switch (type) {
case 0:
vh = (ViewHolder) convertView.getTag();
break;
case 1:
vh3 = (ViewHolder3) convertView.getTag();
break;
default:
break;
}
}
switch (type) {
case 0:
CommentBean comm = (CommentBean) list.get(position);
vh.tv_name.setText(comm.getAccountName());
String time = comm.getUserTime().replace("T", " ");
vh.tv_date.setText(time);
vh.tv_detail.setText(comm.getContent());
String theme = comm.getTitle();
vh.tv_theme.setText("#" + theme);
vh.tv_eye.setText(comm.getClickCount());
vh.tv_comments.setText(comm.getReplyCount());
vh.tv_good.setText(comm.getFavourableCount());
String img_head = comm.getIconPath();
p.load(img_head).error(R.mipmap.ic_launcher).into(vh.iv_head);
break;
case 1:
CommentBean3 comm3 = (CommentBean3) list.get(position);
vh3.tv_name.setText(comm3.getAccountName());
String time3 = comm3.getUserTime().replace("T", " ");
vh3.tv_date.setText(time3);
vh3.tv_detail.setText(comm3.getContent());
String theme3 = comm3.getTitle();
vh3.tv_theme.setText("#" + theme3);
vh3.tv_eye.setText(comm3.getClickCount());
vh3.tv_comments.setText(comm3.getReplyCount());
vh3.tv_good.setText(comm3.getFavourableCount());
String img_head3 = comm3.getIconPath();
p.load(img_head3).error(R.mipmap.ic_launcher).into(vh3.iv_head);
break;
default:
break;
}

return convertView;

}

然而报错
代码:
Process: com.ok.starfinder, PID: 9121
java.lang.ClassCastException: com.ok.starfinder.adapter.SquareListAdapter$ViewHolder3 cannot be cast to com.ok.starfinder.adapter.SquareListAdapter$ViewHolder
at com.ok.starfinder.adapter.SquareListAdapter.getView(SquareListAdapter.java:124)
at android.widget.AbsListView.obtainView(AbsListView.java:2240)
at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
at android.widget.ListView.onMeasure(ListView.java:1175)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16497)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
at android.view.View.measure(View.java:16497)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1940)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1137)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1319)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1024)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5694)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5045)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)

希望有大神解决一下,急

0

1个回答

java.lang.ClassCastException: com.ok.starfinder.adapter.SquareListAdapter$ViewHolder3 cannot be cast to com.ok.starfinder.adapter.SquareListAdapter$ViewHolder
at com.ok.starfinder.adapter.SquareListAdapter.getView(SquareListAdapter.java:124)
你看看124行有啥问题,看错误提示是类型转换出错了。

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
复用convertView的原理
ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,
listView的convertView复用引发的问题解决
import java.util.List; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.view.LayoutInflat
listview复用convertView导致CheckBox复选的问题
解决的方法: 我们先将checkbox的是否选中的状态根据position保存下来,然后在adapter的getview方法中,我们通过position来动态设置checkbox的状态。 在此之前,由于item中有checkbox,与listview的item点击事件发生了冲突,我们需要在item布局里的checkbox控件中 添加如下两行代码:
关于ConvertView错乱的问题
下午遇到一个很奇怪的问题,修改了ListView中的一个item对象的类型,执行notifyDatasetChange方法后,getView 传过来的convertView类型不对!导致View绘制时调用对象数据错误!!!现象是这样的:在单个card中执行updateCardView方法时,更新对象类型,直接notifyDataSetChange方法,没有任何问题。 但是改为下面的写法就不行了ne
ListView嵌套GridView,GridView的Adapter无法复用convertView
ListView只有i1个item,这个item就是GridView,现在GridView的Adapter出现问题,convertView一直为null
ListView中convertView和ViewHolder的复用机制工作原理
我们都知道在getView方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个子View,如:一个TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用viewHolder,把每一个子View都放在Holder中,当第一次创建convertView对象时,把这些子view找出来。然后用convertView的setTag
getView()不复用convertView,ListView即毫无复用!(ListView回收机制)
前提概要 getView()不复用convertView,ListView即毫无复用! 标题的话不知道有没有震惊到大家,反正是与笔者一直以来的想法相悖的。 之前笔者一直认为,使用BaseAdapter如果不复用convertView,那么可能会一定程度上降低ListView的性能,但是ListView本身一定还有其优化性能的方式,所以写demo时也经常偷一下懒,就不写convertV...
Android listView异步下载和convertView复用产生的错位问题
1:Item图片显示重复 这个显示重复是指当前行Item显示了之前某行Item的图片。 比如ListView滑动到第2行会异步加载某个图片,但是加载很慢,加载过程中ListView已经滑动到了第14行,且滑动过程中该图片加载结束。第2行已不在屏幕内,根据上面介绍的缓存原理,第2行的View对象可能被第14行复用,这样我们看到的就是第14行显示了本该属于第2行的图片,造成显示重复。
46黑名单显示的bug---(优化ListView)convertView复用带来的问题
是这样的需求: 在黑名单的列表中前三个显示特殊的颜色,后面的列表显示其他的颜色,如图: 但是当翻到第二屏的时候,我们发现了: 哇,这样是怎么回事呢?根源在于convertView的复用带来的问题。 我本来的代码如下: 修改为如下: ListView的Item可能带有其他控件,比如CheckBox,带来点击状态的问题。后序会在IM项目中详解。
ExpandableListView动态编辑 item出现convertView 复用错乱问题
Activity 页面 private int[][] tags = null; private int a; private int b; protected void init() { setContentView(R.layout.activity_tank_list_editor); Intent intent = getIntent();
关于 HttpClient的复用问题
https://segmentfault.com/q/1010000013418398
关于端口复用问题?
服务器端和客户端建立了连接,在不断开连接的状态下,怎样把服务器端再次处于监听状态?最好有源代码?(初学JAVA)
关于tableView复用的问题
在这里我只讲解一下
关于cell的复用问题? cell的复用机制?
关于cell的复用问题? cell的复用机制? TableView的重用机制,为了做到显示和数据分离,IOS tableView的实现并且不是为每个数据项创建一个tableCell。而是只创建屏幕可显示最大个数的cell,然后重复使用这些cell,对cell做单独的显示配置,来达到既不影响显示效果,又能充分节约内容的目的。下面简要分析一下它的实现原理。重用实现分析   查看UITableVie
在生成convertView时,同时设置Button的OnClickListener,convertView是被不断地复用的,这样的OnClickListener也就可以被不断地复用,
来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4146512.html    给ListView中每个item绑定点击事件的方法,比较常见的如下这种方式: 1 public View getView(int positon, View convertView, ViewGroup parent){ 2 if(nul
Listview 异步加载图片 快速滑动发生图片错误的解决办法 复用convertview
参考 http://www.3lian.com/edu/2013/08-03/86585.html 说明了复用convertview的后果,病ge
Android性能:经典ListView适配器convertView缓存及复用机制
Android性能:经典ListView适配器convertView缓存及复用机制 Android中的ListView常用Adapter中都会涉及到convertView的使用,使用convertView主要是为了缓存试图View,用以增加ListView的item view加载效...
解决BaseAdapter中多布局convertView复用加载错误
MyWidget mywidget; @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView==null) { mywidget=new MyWidget(); Log.d("logd", position+"--"+list.get(p
安卓开发,listview的优化,减少内存消耗,复用convertView、ViewHolder和分页加载
1:复用convertView,可以减少view对象的创建。adapter中的getview()方法会传经来一个convertView,convertView是指曾经使用过的view对象,可以被重复使用。但是使用之前要判断是否为空,否则可能会报空指针异常,不为空就直接复用,并作为getview方法的返回对象。 @Override public View getV
62应用程序管理器的复杂UI显示&&复用convertView出现的BUG
在应用程序管理器的复杂UI显示中,当我们拖动Listview界面的时候,下屏的第一个item出现后,程序挂掉了,打开logcat,发现提示的日志是空指针异常: 出现的空指针异常的行数在这一行上: holder.icon.setImageDrawable(appInfo.getIcon()); 那么为什么出现的
解决ListView滚动复用convertview和ViewHolder数据填充错乱
我说下我的理解,最可能出现重复的情况就是getView(int position, View convertView, ViewGroup parent)中的convertview利用的情况,由于getview的时候,listview自身会复用已存在的item,即重用最先新建的那几个item,还有就是注意tag的使用,convertView.getTag()返回的也是重用的view,其状态是和被重
ListView有多种Item时convertView的复用机制之我见
convertView的复用机制        通俗理解:假如一个屏幕最多显示7个Item,当Item1被滑出屏幕,此时Item1 的View会被添加进Recycler(反复循环器)中,相应的在下部就会产生一个Item8,这时调用getView方法,convertView参数就是Item1 的View,也就是说,此时的convertView就是Item1 的复制版(副本)。        那么...
ListVeiw适配器工具类+焦点抢占+convertView复用导致内容错乱
ListVeiw适配器工具类+焦点抢占+convertView复用导致内容错乱
关于复用
今天见到林锐的高见,虽然对这些东西一直以来都是认同的,也是自己的观点,但是从不同来源得到,给人的头脑的影响差别非常巨大的。谈到复用,复用不是人类懒惰的表现,而是智慧的表现。因为人类总是在继承了前人的成果,不断加以利用、改进或创新后才会进步。进步是应该的,不进步则是可耻的。
关于复用
make it easy to reuse。程序模块的开发一定要能够很容易的被复用,这也是软件开发的要求,可是在实际情况中,由于很多模块设计,让使用者非常难以理解和了解调用方法,发现复用已有的东西,比自己编写还难。我想大家就不会去利用复用这个功能了。
关于复用组件的安装卸载问题
各位高手,我这里有个对复用组件的安装、卸载的问题。不知道各位遇到过没有,该如何解决呢?rnrn起因是这样:rnrn经过一段时间的开发,手头拥有了若干现成的可以复用的COM组件DLL。rnrn然后我在自己的多个应用软件项目使用它们。因为它们都是相同的文件,又是COM组件。我就在安装包里把复用组件安装在Program Files\Common Files\(Company Name)下面了。rnrn这样既节省磁盘空间,也确实体现了复用啊。而且通过观察Common Files,我看到很多公司大概也是这样做的。rnrn可是现在问题来了。假如在同一台机器上安装了两个我的软件,它们又共享了相同的若干组件DLL。现在卸载其中一个软件,安装程序会把被共享的组件也删除,导致另一个没有卸载的软件也不能工作了!rnrn而如果我选择让装在Common Files里的文件,装上就再也不卸了。那么这个问题固然解决了。而且对于现在的巨大硬盘来说,那点DLL似乎也不算什么。可是感觉毕竟不是个完美的解决办法。rnrn请问各位高手?你们(或者你们公司)遇到过这样的问题吗?是怎么解决的?rnrn谢谢!
关于窗口复用的一个问题
rn 我先建立了一个 WindowParent窗口 窗口上有一个按钮rn 再建立一个WindowChild窗口 继承自WindowParent窗口 rn 为什么在WindowChild窗口中建立一个单击事件 弹出一个子窗口显示“这是子窗口“ 生成后没有响应?rn 只有在WindowParent窗口中建立一个单击事件 才有响应
关于fastlane证书复用问题
最近使用fastlane,每当新建一个project/target的时候,当执行 match development/adhoc/appstore时候,不同的bundle id对应的target,每次都会去重新生成certificate,注意不是Provision Profile,这就很麻烦了,因为苹果的个人开发者账号,certificate生成是有数量限制的。 development和 dist...
急!!关于RConnection复用的问题?
rn我这里声明了一个RConnection对象conn,并且已经open并且start,于是我利用RSocket::Open(RSocketServ &aServer, TUint addrFamily, TUint sockType, TUint protocol, RConnection &aConnection);打开了第一个Socket,我的疑问就是这个时候我可以还利用conn打开第二个Socket吗?rnrn简要叙述就是同一个RConnection对象,可以同时打开多个Socket吗?如果不能,有甚么解决方法没有呢?rnrn急啊,麻烦各位大侠帮帮忙
问下关于Sprite的复用的问题
如何复用sprite啊?在改变其中一个引用时又不会改变其他引用的状态?
关于MSHFlexGrid控件复用问题
最近在开发一个报税软件,里面用到了MSHFLexGrid控件。rnrn过程是这样的,第一次从数据库里取得数据然后使用 AddItem方法 一项一项插入表格里。一点问题都没有。rnrn数据显示完毕会进行一系列的选择后,然后将MSHFlexGrid控件复用,刷新后只显示选择后的数据。但奇怪的是rnrn刷新后控件里面只显示TextMatrix设定的表格头,对于新AddItem加载的数据都无法显示。复用的时候的代码是:rnrnrn rn Dim i As Integerrn For i = 1 To iRowsNo - 1 'iRowsNo 是全局变量,表示当前有多少列数据需要显示rn DataTable.RemoveItem 1 '这里的目的将原来显示的数据清空掉rn Next irn InitFields '使用TextMatrix设置显示表格头rn ShowData GetDataFromCart 'showData 是显示数据的函数 GetDataFromCart取数据库得到数据rnrnrnrn'这里将ShowData的实现也贴出来了。rnPrivate Function ShowData(Jobs() As JobInvTemp)rn Dim row As Stringrn Dim i As Integerrn i = 0rn Do While (Jobs(i).Job <> "NULL")rn rn row = "" & vbTab & iRowsNo & vbTab & Jobs(i).Job & vbTab & Jobs(i).JobDate & vbTab & Jobs(i).Price & vbTab & Jobs(i).GSTrn DataTable.AddItem row, iRowsNorn iRowsNo = iRowsNo + 1rn i = i + 1rn LooprnEnd Functionrnrn rn因为对这个控件很不熟悉,所以实在查不出来到底出什么问题了。rn请大家帮帮忙,谢谢了。rnrn
关于数据库连接代码的复用问题
因为好几个页面都要连接数据库,所以我想把这些一样的代码单独放在一个cs文件里面,如b.cs:rnnamespace brnrn public class DGConnectionrn rn public SqlConnection adminConn;rn public void bindgrid()rn rn string DGConnString = "...这里是连接数据库的string语句";rn adminConn = new SqlConnection(DGConnString);rn rn rnrn随后在需要连接数据库的页面中调用这个类,如a.cs中:rnnamespace arnrnpublic class AClassrnrn private void Page_Load(object sender, System.EventArgs e)rn rn if(!Page.IsPostBack)rn rn BindGrid();//数据库与datagrid绑定的函数rn rn rn private void BindGrid()rn rn b.DGConnection dgconn = new b.DGConnection();//创建b类的对象rn dgconn.bindgrid();//创建对象后调用连接数据库的方法rn string adminSQL = "SELECT * FROM test";rnrn DataSet ds = new DataSet();rnrn SqlDataAdapter adminAdapter = new SqlDataAdapter(adminSQL,adminConn);rn adminAdapter.Fill(ds,"table1");rnrn //dg是页面中datagrid的IDrn dg.DataSource = ds.Tables["table1"].DefaultView;rn dg.DataBind();rn rnrnrnrn编译后报错:rn行SqlDataAdapter adminAdapter = new SqlDataAdapter(adminSQL,adminConn);rnadminConn在a.AClass中不存在rnrn这个adminConn的确是在b类中定义的,现在在a类中我要调用,该怎么办呢?或者我的一开始的思路就有问题吧,不知有哪位高手能解决数据库连接的代码复用的问题?
关于自定义 UITABLEVIEWCELL 复用问题
自定义UITableViewCell的方法有很多 发现一些人都会遇到自己定义的cell里面图片错乱的问题 这个问题往往是因为没有实现prepareForReuse这个方法导致的. UITableViewCell在向下滚动时复用, 得用的cell就是滑出去的那些, 而滑出去的cell里显示的信息就在这里出现了 解决的方法就是在UITableViewCell的子类里实现perpareForReu
关于 CheckBox 和 RecyclerView 的复用问题
本篇文章主要实现两个功能: 在 RecyclerView 中使用 CheckBox 时,解决选中一个 CheckBox ,因为复用的关系,造成多个 CheckBox 被选中 解决全选 CheckBox 的 bug 本文主要为了功能实现,没有源码分析,望见谅 针对问题一:解决 UI 显示的问题 首先初始化一个 SparseBooleanArray 类,用于存储每个 item 对应的 Chec...
关于TNMUDP端口复用的问题!
同一台主机上的两个程序(或一个程序的两个或多个拷贝在运行),使用同样的接收端口,为了使这两个或多个程序都能接收到UDP包,可以用API函数setsocketopt设置为REUSEPORT,即端口复用,但是我用了TNMUDP组件的情况下,怎样使端口复用?多谢
关于ListView使用ConvertView和ViewHolder实现性能优化
listView如果item非常多的时候,可以使用ConvertView和ViewHolder来提高效率。Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; i
ios 关于tableview的复用问题,避免假复用
自从开始做ios开发,自己开发了很多客户端,也看到很多别人写的程序,发现很多人在做程序的时候走入了很多误区,比如tableview的复用,tableview的复用是为了解决大量数据的内存管理问题,优化软件的运行质量,但是因为问题只会影响到运行的质量问题,对于实现功能没有影响,因此这类问题在开发的时候很难被察觉,因此想提高软件质量的童鞋可以试试了解一下这个问题的优化方法。希望对大家有所帮助 了解软
convertView的疑问(软件管理器)
1 package com.hixin.appexplorer; 2 3 import java.util.List; 4 5 import android.app.Activity; 6 import android.content.Context; 7 import android.content.pm.PackageInfo; 8 import andr...
ConvertView优化源码分析
课程解了ListView常见使用方法和注意事项.分析了网络编程的实现机制和一二级缓存的优化技巧。视频中对线程池、软引用、一级缓存、二级缓存做了源码分析。课程是案例驱动. 不适合Android初级的朋友。
ListView学习笔记(二)—— ConvertView
在Android的UI组件中,ListView是一个非常实用的组件。该组件主要是用于展示大批量的同类数据,比如联系人信息。 而在自定义ListView的样式时,需要重写数据接口的ListAdapter类中的getView函数,以此来定制ListView中每个item的样式。在这
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo