Android(安卓)listview多类型item问题
16lz
2021-01-26
今天在做一个列表,第一项和其他项的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>=getViewTypeCount().
getChanneltype() 是1、2、3要使之与getViewTypeCount()返回的值一致,就必须getItem(position).getChanneltype() - 1,然后改变getView()里面的1、2、3为0、1、2。这样问题就解决了。
排版不是很好望见谅。
以上希望能对你有帮助。
更多相关文章
- 【androd基础】之Android(安卓)返回键的调用
- Android(安卓)API之android.view.View.MeasureSpec
- Android中Cursor 的一些方法
- Android异常总结---type Status report message HTTP method GET
- 百度map api for Android~搜索服务
- [置顶] ANDROID 返回,菜单和HOME键的监听
- 重画Progressbar的进度
- Android在线更新版本(服务端+客户端Code)
- ReactNative 中 android按两次返回键退出当前应用程序