您的位置:首页 > 移动开发 > Android开发

Android Listview item多种子布局实现方法详解

2015-12-16 12:15 756 查看
很多时候ListView的每一项item不一定是一摸一样的布局,也不符合现实需求,往往item的布局会呈现多样性,例如美团,新闻类等客户端这是某新闻类客户端,所展示出来的就是不同的子布局,当前有两种形式,而他们又都在一个ListView里面,如何实现了,其实很简单,只需要ListView的适配器里面实现几个方法就可以了只需要三步第一步重写:
getViewTypeCount()方法:
@Override
public int getViewTypeCount() {
return super.getViewTypeCount();
}
这是回调方法,作用是返回Listview中有多少种子布局,你有多少种就返回多少,类型int
这里展现的有两种,我就返回2
重写如下:
public static final TYPE_COUNT=2;//子布局总数2
@Override
public int getViewTypeCount() {
return 2;
}
如果这里不设置int返回总数,就会报View的转换异常错误
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;//一个图片的itempublic static final int TYPE_THREE = 1;//三个图片的item@Overridepublic 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>
@Overridepublic 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;}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息