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

很多时候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;//一个图片的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;
        }


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值