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;}
相关文章推荐
- Android布局的小窍门?
- Web布局连载——两栏固定布局(五)
- Ruby中的异常处理代码编写示例
- 样式表CSS布局经验
- css网页布局中注意的几个问题小结
- DL.DT.DD实现左右的布局简单例子第1/2页
- 使用CSS框架布局的缺点和优点小结
- div+CSS网页布局的意义与副作用原因小结第1/2页
- MySQL抛出Incorrect string value异常分析
- Android编程之代码创建布局实例分析
- CSS顶级技巧大放送,div+css布局必知
- 用div实现像table一样的布局方法
- 精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
- jQuery EasyUI 布局之动态添加tabs标签页
- 详解JavaScript中的异常处理方法
- java程序中的延时加载异常及解决方案
- 解析Java异常的栈轨迹及其相关方法
- .NET(C#):Emit创建异常处理的方法
- windows7服务器上weblogic启动失败异常解决方法
- android自定义RadioGroup可以添加多种布局的实现方法