很多时候ListView的每一项item不一定是一摸一样的布局,也不符合现实需求,往往item的布局会呈现多样性,例如美团,新闻类等客户端
这是某新闻类客户端,所展示出来的就是不同的子布局,当前有两种形式,而他们又都在一个ListView里面,如何实现了,其实很简单,只需要ListView的适配器里面实现几个方法就可以了
只需要三步
第一步重写:
getViewTypeCount()方法:
这是回调方法,作用是返回Listview中有多少种子布局,你有多少种就返回多少,类型int@Override public int getViewTypeCount() { return super.getViewTypeCount(); }
这里展现的有两种,我就返回2
重写如下:
如果这里不设置int返回总数,就会报View的转换异常错误public static final TYPE_COUNT=2;//子布局总数2 @Override public int getViewTypeCount() { return 2; }
java.lang.ClassCastException: com.xhsc.news.startactvity.contentfragment.
HttpNewsFragmentItem$XListViewAdapter$
MoreViewHolder
cannot be cast to com.xhsc.news.startactvity.contentfragment.HttpNewsFragmentItem$XListViewAdapter$
OneViewHolder
at com.xhsc.news.startactvity.contentfragment.HttpNewsFragmentItem$XListViewAdapter.getOneIMageView(HttpNewsFragmentItem.java:291)
at com.xhsc.news.startactvity.contentfragment.HttpNewsFragmentItem$XListViewAdapter.getView(HttpNewsFragmentItem.java:225)
所以这里不许有一个返回数,在适配器的getView()方法回调用这个方法得到布局总数,否则默认是同一种布局
第二步:重写getItemViewType(int position);返回item相应位置的子布局型式,再返回view实例的getView()方法进行判断返回那种布局View
代码如下:其中使用了传入进来的Gson数据,你可以替换成你相应的数据,
获取当前位置的某一个数据为空还是不为空,返回对应的布局形式Type的实例view
public static final int TYPE_ONE = 0;//一个图片的item public static final int TYPE_THREE = 1;//三个图片的item @Override public int getItemViewType(int position) { if (((GsonBean.ArrayContent) getItem(position)).getImgextra() == null) { return TYPE_ONE;//只有一张图片的 } else { return TYPE_THREE;//有三张图片的 } }
第三步:getView()方法返回View实例也是最重要的一步,通过逻辑控制语句,上面两步不能少,适配器Adapter其他回调方法没有变化,正常书写就行了
根据getItemViewType<span style="font-family: 宋体;">(int position)返回值,返回对应View</span>
<span style="font-family:宋体;">具体代码如下:</span>
<span style="font-family:宋体;">getView()方法</span>
@Override public View getView(int position, View convertView, ViewGroup parent) { switch (getItemViewType(position)) { case TYPE_ONE: return getOneIMageView(position, convertView, parent); case TYPE_THREE: return getMoreIMageView(position, convertView, parent); default: return null; } }
因为是网络数据这里用到了第三方Picasso工具加载网络图片和Gson解析json数据,可以替换成一般性数据,验证;
适配器内部类的写法,做了ListView二级优化
/** * 多张图片布局的 * * @param position * @param convertView * @param parent * @return */ public View getMoreIMageView(int position, View convertView, ViewGroup parent) { View v; MoreViewHolder viewHodler = null; if (convertView == null) { v = layoutInflater.inflate(R.layout.news_fragment_xlistview_item_threeimg_layout, null); viewHodler = new MoreViewHolder(); viewHodler.titleTextView = (TextView) v.findViewById(R.id.xlistview_item1_title_textview); viewHodler.pingJiaTextView = (TextView) v.findViewById(R.id.news_fragment_item_three_pingjia); viewHodler.imageViewOne = (ImageView) v.findViewById(R.id.news_fragment_item_three_imageview_one); viewHodler.imageViewTwo = (ImageView) v.findViewById(R.id.news_fragment_item_three_imageview_two); viewHodler.imageViewThree = (ImageView) v.findViewById(R.id.news_fragment_item_three_imageview_three); v.setTag(viewHodler); } else { v = convertView; viewHodler = (MoreViewHolder) convertView.getTag(); } GsonBean.ArrayContent arrayContent = (GsonBean.ArrayContent) getItem(position); Picasso.with(getActivity()).load(arrayContent.getImgsrc()).into(viewHodler.imageViewOne); Picasso.with(getActivity()).load(arrayContent.getImgextra().get(0).getImgsrc()).into(viewHodler.imageViewTwo); Picasso.with(getActivity()).load(arrayContent.getImgextra().get(1).getImgsrc()).into(viewHodler.imageViewThree); viewHodler.pingJiaTextView.setText(""); viewHodler.titleTextView.setText(arrayContent.getTitle()); return v; } class MoreViewHolder { TextView titleTextView; TextView pingJiaTextView; ImageView imageViewOne; ImageView imageViewTwo; ImageView imageViewThree; }
/** * 只有一张图片布局的 * * @param position * @param convertView * @param parent * @return */ public View getOneIMageView(int position, View convertView, ViewGroup parent) { View v; OneViewHolder viewHodler = null; if (convertView == null) { viewHodler = new OneViewHolder(); v = layoutInflater.inflate(R.layout.news_fragment_xlistview_item1_layout, null); viewHodler.imageViewIcon = (ImageView) v.findViewById(R.id.xlistview_item1_icon_img); viewHodler.titleTextView = (TextView) v.findViewById(R.id.xlistview_item1_title_textview); viewHodler.contentTextView = (TextView) v.findViewById(R.id.xlistview_item1_content_txt); v.setTag(viewHodler); } else { v = convertView; viewHodler = (OneViewHolder) convertView.getTag(); } GsonBean.ArrayContent arrayContent = (GsonBean.ArrayContent) getItem(position); Picasso.with(getActivity()).load(arrayContent.getImgsrc()).into(viewHodler.imageViewIcon); viewHodler.titleTextView.setText(arrayContent.getTitle()); viewHodler.contentTextView.setText(arrayContent.getDigest()); return v; } class OneViewHolder { ImageView imageViewIcon; TextView titleTextView; TextView contentTextView; }