listview里面的item的多种view模式(多种类型的item)

如果只是简单的实现单一的item,就只要重写下面的四个方法:

int getCount():返回数据源中数据项的总数量
        
        Object getItem(int position):根据position从数据源中获取数据项
        
        long getItemId(int position): 根据position从数据源中获取数据项ID
        
        View getView(int position, View convertView, ViewGroup parent):根据position创建View,它是Adapter中最重要的方法,listView通过它创建View。

如若要实现不同类型的item就需要再重写以下两种的方法:

   int getViewTypeCount():返回item使用的View模式的总数量。
        
        int getItemViewType(int position):根据position获取对应item使用的View模式。

adapter重点代码:

//表示我有多少个item的类型
    private static final int ITEMCODE_VIDEO = 0;
    private static final int ITEMCODE_GATHER = 1;
    private static final int ITEMCODE_TEXT_FOOT = 2;
    private static final int ITEMCODE_TEXT_HEADER = 3;
    private static final int ITEMCODE_FOLLOW = 4;

//按类型返回
        switch (type) {
            case ITEMCODE_VIDEO://视频项
                final VideoHolder videoHolder;
                if (convertView == null) {
                    videoHolder = new VideoHolder();
                    convertView = mInflater.inflate(R.layout.item_home, parent, false);
                    ButterKnife.bind(videoHolder, convertView);
                    convertView.setTag(videoHolder);
                } else {
                    videoHolder = (VideoHolder) convertView.getTag();
                }
                videoHolder.mTvHomeBottom.setText(DateFormatUtil.getDetail(dataBean));//设置类型和时间
                videoHolder.mTvHomeTitle.getPaint().setFakeBoldText(true);//加粗
                videoHolder.mTvHomeTitle.setText(dataBean.getTitle());//设置标题
                if (mDatas.get(position).getType().equals("video")) {
                    Picasso.with(EyesApplication.getContext())
                            .load(dataBean.getCover().getDetail())
                            .resize(SizeUtils.dp2px(mContext, 500), SizeUtils.dp2px(mContext, 250))
                            .centerCrop()
                            .config(Bitmap.Config.RGB_565).into(videoHolder.mIvHomeContent);
                }
                //点击事件
                videoHolder.mGroupHomeVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //跳转到视频页面
                        Intent intent = new Intent(mContext, SelsetedActivity.class);
                        intent.putExtra(SelsetedActivity.DATA, dataBean);
                        //动画
                        if (android.os.Build.VERSION.SDK_INT > 20) {
                            mContext.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mContext, videoHolder.mIvHomeContent, "transitionImg").toBundle());
                        } else {
                            mContext.startActivity(intent);
                        }
                    }
                });
                return convertView;
	case ITEMCODE_VIDEO://视频项
	case...
	}


//通过这个方法选取使用那个item的类型
    @Override
    public int getItemViewType(int position) {
        String type = mDatas.get(position).getType();
        Log.v("message", "类型:" + type + mDatas.get(position).getData().getTitle());
        if ("videoCollectionOfFollow".equals(type)) {
            return ITEMCODE_FOLLOW;
        } else if ("videoCollectionWithCover".equals(type)) {
            return ITEMCODE_GATHER;//集合项
        } else if ("textHeader".equals(type)) {
            return ITEMCODE_TEXT_HEADER;
        } else if ("textFooter".equals(type)) {
            return ITEMCODE_TEXT_FOOT;//文字项
        }
        return ITEMCODE_VIDEO;//视频项
    }

//返回你有多少个item的类型
    @Override
    public int getViewTypeCount() {
        return 5;
    }


adapter所有代码:

public class HomeBaseAdapter extends BaseAdapter {
	//表示我有多少个item的类型
    private static final int ITEMCODE_VIDEO = 0;
    private static final int ITEMCODE_GATHER = 1;
    private static final int ITEMCODE_TEXT_FOOT = 2;
    private static final int ITEMCODE_TEXT_HEADER = 3;
    private static final int ITEMCODE_FOLLOW = 4;
    private List<ItemListBean> mDatas;//数据的集合
    private final Activity mContext;//连接上下文的Context
    private final LayoutInflater mInflater;

    public HomeBaseAdapter(Activity context) {
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
    }

    public void setData(List<ItemListBean> datas) {
        mDatas = datas;
    }

    @Override
    public int getCount() {
        return mDatas != null ? mDatas.size() : 0;
    }

    @Override
    public Object getItem(int position) {
        return mDatas.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        int type = getItemViewType(position);
        final DataBean dataBean = mDatas.get(position).getData();
        //按类型返回
        switch (type) {
            case ITEMCODE_VIDEO://视频项
                final VideoHolder videoHolder;
                if (convertView == null) {
                    videoHolder = new VideoHolder();
                    convertView = mInflater.inflate(R.layout.item_home, parent, false);
                    ButterKnife.bind(videoHolder, convertView);
                    convertView.setTag(videoHolder);
                } else {
                    videoHolder = (VideoHolder) convertView.getTag();
                }
                videoHolder.mTvHomeBottom.setText(DateFormatUtil.getDetail(dataBean));//设置类型和时间
                videoHolder.mTvHomeTitle.getPaint().setFakeBoldText(true);//加粗
                videoHolder.mTvHomeTitle.setText(dataBean.getTitle());//设置标题
                if (mDatas.get(position).getType().equals("video")) {
                    Picasso.with(EyesApplication.getContext())
                            .load(dataBean.getCover().getDetail())
                            .resize(SizeUtils.dp2px(mContext, 500), SizeUtils.dp2px(mContext, 250))
                            .centerCrop()
                            .config(Bitmap.Config.RGB_565).into(videoHolder.mIvHomeContent);
                }
                //点击事件
                videoHolder.mGroupHomeVideo.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //跳转到视频页面
                        Intent intent = new Intent(mContext, SelsetedActivity.class);
                        intent.putExtra(SelsetedActivity.DATA, dataBean);
                        //动画
                        if (android.os.Build.VERSION.SDK_INT > 20) {
                            mContext.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(mContext, videoHolder.mIvHomeContent, "transitionImg").toBundle());
                        } else {
                            mContext.startActivity(intent);
                        }
                    }
                });
                return convertView;
            case ITEMCODE_GATHER://集合类型
                GatherHolder gatherHolder;
                if (convertView == null) {
                    gatherHolder = new GatherHolder();
                    convertView = mInflater.inflate(R.layout.item_home_gether, parent, false);
                    ButterKnife.bind(gatherHolder, convertView);
                    convertView.setTag(gatherHolder);
                } else {
                    gatherHolder = (GatherHolder) convertView.getTag();
                }
                HomeHeader header = dataBean.getHeader();
                Picasso.with(mContext).load(header.getCover())
                        .config(Bitmap.Config.RGB_565).into(gatherHolder.mIvHomeGatherHeader);
                //设置recyclerview
                gatherHolder.mRvHomeGatherContent.setLayoutManager(new GridLayoutManager(mContext, 1, LinearLayoutManager.HORIZONTAL, false));
                HomeRvadapter rvadapter = new HomeRvadapter(mContext, dataBean);
                gatherHolder.mRvHomeGatherContent.setAdapter(rvadapter);

                return convertView;
            case ITEMCODE_FOLLOW://热门推荐
                FollwHolder follwHolder;
                if (convertView == null) {
                    follwHolder = new FollwHolder();
                    convertView = mInflater.inflate(R.layout.item_home_follw, parent, false);
                    ButterKnife.bind(follwHolder, convertView);
                    convertView.setTag(follwHolder);
                } else {
                    follwHolder = (FollwHolder) convertView.getTag();
                }
                HomeHeader floowHeader = dataBean.getHeader();
                follwHolder.mTvFollwTitle.getPaint().setFakeBoldText(true);
                follwHolder.mTvFollwTitle.setText(floowHeader.getTitle());
                follwHolder.mTvFollwDetail.setText(floowHeader.getDescription());
                //设置recyclerview
                follwHolder.mRvHomeFollwContent.setLayoutManager(new GridLayoutManager(mContext, 1, LinearLayoutManager.HORIZONTAL, false));
                HomeRvadapter floowAdapter = new HomeRvadapter(mContext, dataBean);
                follwHolder.mRvHomeFollwContent.setAdapter(floowAdapter);
                return convertView;
            case ITEMCODE_TEXT_FOOT://底部文字类型
                convertView = mInflater.inflate(R.layout.item_home_foottext, parent, false);
                TextView footTv = (TextView) convertView.findViewById(R.id.tv_home_foottext);
                //设置数据
                String footText = dataBean.getText();
                if (!TextUtils.isEmpty(footText)) {
                    footTv.setText(footText);
                }
                return convertView;
            case ITEMCODE_TEXT_HEADER://顶部文字类型
                convertView = mInflater.inflate(R.layout.item_home_heandertext, parent, false);
                TextView headerTv = (TextView) convertView.findViewById(R.id.tv_home_handertext);
                //添加自定义字体及字体加粗
                Typeface face = Typeface.createFromAsset (EyesApplication.getContext().getAssets(),"fonts/timesi.ttf");
                headerTv.setTypeface(face);
                TextPaint tp = headerTv.getPaint();
                tp.setFakeBoldText(true);
                //设置数据
                String handText = dataBean.getText();
                if (!TextUtils.isEmpty(handText)) {
                    Spanned fromHtml = Html.fromHtml("<font color='black' font='" + dataBean.getFont() + "' size='24'>" + dataBean.getText() + "</font>");
                    headerTv.setText(fromHtml);
                }
                return convertView;

        }
        return null;
    }
//通过这个方法选取使用那个item的类型
    @Override
    public int getItemViewType(int position) {
        String type = mDatas.get(position).getType();
        Log.v("message", "类型:" + type + mDatas.get(position).getData().getTitle());
        if ("videoCollectionOfFollow".equals(type)) {
            return ITEMCODE_FOLLOW;
        } else if ("videoCollectionWithCover".equals(type)) {
            return ITEMCODE_GATHER;//集合项
        } else if ("textHeader".equals(type)) {
            return ITEMCODE_TEXT_HEADER;
        } else if ("textFooter".equals(type)) {
            return ITEMCODE_TEXT_FOOT;//文字项
        }
        return ITEMCODE_VIDEO;//视频项
    }
//返回你有多少个item的类型
    @Override
    public int getViewTypeCount() {
        return 5;
    }

    public static class VideoHolder {//这里的我是使用黄油刀获取的holder,你们可以使用findViewById
        @Bind(R.id.group_home_video)
        RelativeLayout mGroupHomeVideo;
        @Bind(R.id.iv_home_content)
        ImageView mIvHomeContent;
        @Bind(R.id.tv_home_title)
        TextView mTvHomeTitle;
        @Bind(R.id.tv_home_bottom)
        TextView mTvHomeBottom;
    }

    public static class GatherHolder {
        @Bind(R.id.iv_home_gather_header)
        ImageView mIvHomeGatherHeader;
        @Bind(R.id.rv_home_gather_content)
        RecyclerView mRvHomeGatherContent;
    }

    public static class FollwHolder {
        @Bind(R.id.tv_follw_title)
        TextView mTvFollwTitle;
        @Bind(R.id.tv_follw_detail)
        TextView mTvFollwDetail;
        @Bind(R.id.rv_home_follw_content)
        RecyclerView mRvHomeFollwContent;
    }

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值