今天在做一个列表,第一项和其他项的item不一样。在重写BaseAdapter后出现以下这些错误:

11-1923:52:03.552:E/AndroidRuntime(17348):Process:com.huisifang.cms,PID:1734811-1923:52:03.552:E/AndroidRuntime(17348):java.lang.ClassCastException:com.huisifang.cms.fragment.ChannelFragment$NewsAdapter$ViewHolder3cannotbecasttocom.huisifang.cms.fragment.ChannelFragment$NewsAdapter$ViewHolder211-1923:52:03.552:E/AndroidRuntime(17348):atcom.huisifang.cms.fragment.ChannelFragment$NewsAdapter.getView(ChannelFragment.java:511)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.AbsListView.obtainView(AbsListView.java:2285)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.ListView.makeAndAddView(ListView.java:1790)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.ListView.fillDown(ListView.java:691)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.ListView.fillGap(ListView.java:655)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.AbsListView.trackMotionScroll(AbsListView.java:5424)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.AbsListView.scrollIfNeeded(AbsListView.java:3374)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.AbsListView.onTouchMove(AbsListView.java:3774)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.widget.AbsListView.onTouchEvent(AbsListView.java:3583)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.view.View.dispatchTouchEvent(View.java:7714)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2224)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)11-1923:52:03.552:E/AndroidRuntime(17348):atandroid.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2230)

这里只列出一部分。我在stackoverflow提出这个问题,还是老外效率高,15分钟内就给出建议:

youshouldoverride`getViewTypeCount`and`getItemViewType`,otherwiseyouwillgetjustonenull`convertView`@OverridepublicintgetViewTypeCount(){return3;}@OverridepublicintgetItemViewType(intposition){returngetItem(position).getChanneltype()-1;}andin`getView`inttype=getItemViewType(position);andinsteadofswitchingto`1,2and3`youhavetoswitchto`0,1and2`

解决问题后,重写的BaseAdapter代码如下:

privateclassNewsAdapterextendsBaseAdapter{privateList<News>list;privateintselectItem=-1;privateNewsAdapter(List<News>list){if(list==null){this.list=newArrayList<News>();}this.list=list;}publicvoidsetSelectItem(intselectItem){this.selectItem=selectItem;}@OverridepublicintgetViewTypeCount(){return3;}@OverridepublicintgetItemViewType(intposition){returngetItem(position).getChanneltype()-1;}publicintgetCount(){returnlist.size();}publicNewsgetItem(intposition){returnlist.get(position);}publiclonggetItemId(intposition){returnposition;}publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewHoldernewsvh=null;ViewHolder2imagevh=null;ViewHolder3speekvh=null;inttype=getItemViewType(position);if(convertView==null){switch(type){case0:newsvh=newViewHolder();convertView=LayoutInflater.from(getActivity()).inflate(R.layout.speeking_item,null);newsvh.image=(ImageView)convertView.findViewById(R.id.image);newsvh.title=(TextView)convertView.findViewById(R.id.title);newsvh.writer=(TextView)convertView.findViewById(R.id.writer);newsvh.pubdate=(TextView)convertView.findViewById(R.id.pubdate);newsvh.click=(TextView)convertView.findViewById(R.id.click);convertView.setTag(newsvh);break;case1:imagevh=newViewHolder2();convertView=LayoutInflater.from(getActivity()).inflate(R.layout.image_item,null);imagevh.image=(AbScaleImageView)convertView.findViewById(R.id.image);imagevh.layout=(LinearLayout)convertView.findViewById(R.id.line);imagevh.title=(TextView)convertView.findViewById(R.id.title);imagevh.writer=(TextView)convertView.findViewById(R.id.writer);imagevh.pubdate=(TextView)convertView.findViewById(R.id.pubdate);imagevh.click=(TextView)convertView.findViewById(R.id.click);convertView.setTag(imagevh);break;case2:speekvh=newViewHolder3();convertView=LayoutInflater.from(getActivity()).inflate(R.layout.speekall_item,null);speekvh.button=(Button)convertView.findViewById(R.id.speekall_btn);convertView.setTag(speekvh);break;default:break;}}else{switch(type){case0:newsvh=(ViewHolder)convertView.getTag();break;case1:imagevh=(ViewHolder2)convertView.getTag();break;case2:speekvh=(ViewHolder3)convertView.getTag();break;default:break;}}switch(type){case0:newsvh.title.setText(getItem(position).getTitle());newsvh.writer.setText(getItem(position).getWriter());newsvh.pubdate.setText(CommonUtil.getData(getItem(position).getPubdate()));newsvh.click.setText("浏览:"+String.valueOf(getItem(position).getClick()));imageLoader.DisplayImage(AppConfig.IMAGE_ADDRESS+getItem(position).getLitpic(),newsvh.image);newsvh.image.setLayoutParams(newLinearLayout.LayoutParams(imageWidth,(int)(imageWidth*0.8)));break;case1://Log.v("position","position="+position);if(selectItem==position){convertView.setBackgroundColor(0x09ff0000);Log.v("position","position="+position);}imagevh.title.setText(getItem(position).getTitle());imagevh.writer.setText(getItem(position).getWriter());imagevh.pubdate.setText(CommonUtil.getData(getItem(position).getPubdate()));imagevh.click.setText("浏览:"+String.valueOf(getItem(position).getClick()));imagevh.image.setMargin(10);imageLoader.DisplayImage(AppConfig.IMAGE_ADDRESS+getItem(position).getLitpic(),imagevh.image);break;case2:break;default:break;}returnconvertView;}publicclassViewHolder{publicTextViewtitle,writer,pubdate,click;publicImageViewimage;}publicclassViewHolder2{publicTextViewtitle,writer,pubdate,click;publicAbScaleImageViewimage;publicLinearLayoutlayout;}publicclassViewHolder3{publicButtonbutton;}}

如果需要多类型item就要重写getViewTypeCount()和getItemViewType()。

publicintgetItemViewType(intposition):以int数值型返回itemView的类型。publicintgetViewTypeCount():以int数值类型返回列表拥有的itemview的个数,比如上例中,有三种类型的item,此方法返回3。

还有一点要值得主要的:

TheitemviewtypeyouarereturningfromgetItemViewType()is&gt;=getViewTypeCount().

getChanneltype() 是1、2、3要使之与getViewTypeCount()返回的值一致,就必须getItem(position).getChanneltype() - 1,然后改变getView()里面的1、2、3为0、1、2。这样问题就解决了。


排版不是很好望见谅。

以上希望能对你有帮助。


更多相关文章

  1. 【androd基础】之Android(安卓)返回键的调用
  2. Android(安卓)API之android.view.View.MeasureSpec
  3. Android中Cursor 的一些方法
  4. Android异常总结---type Status report message HTTP method GET
  5. 百度map api for Android~搜索服务
  6. [置顶] ANDROID 返回,菜单和HOME键的监听
  7. 重画Progressbar的进度
  8. Android在线更新版本(服务端+客户端Code)
  9. ReactNative 中 android按两次返回键退出当前应用程序

随机推荐

  1. 最全面的AndroidStudio配置指南总结-包括
  2. 移动端键盘弹起引起的fixed定位问题
  3. Android(安卓)ViewDragHelper实现窗帘效
  4. 微软:Android(安卓)智能手机正在被僵尸网
  5. Android(安卓)Pay,能冲破第三方支付围堵
  6. Android内存泄漏检测及修复(转载)
  7. iOS 开发者的 Android(安卓)第一课
  8. Android、iOS和Windows Phone中的推送技
  9. Android--播放Gif的取巧办法
  10. Back Stack学习之Android退出方法小结