ListView实现多种Item的复杂布局

1.ListView的Adapter实现如下:

class CollectionAdapter extends BaseAdapter {

        private static final int VIEW_TYPE = 3;
        private static final int TYPE_0 = 0; // 手机科技资讯
        private static final int TYPE_1 = 1; // 图片资讯
        private static final int TYPE_2 = 2; // 新闻博客

        @Override
        public int getCount() {
            return mList.size();
        }

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

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

        /**
         * 每个convertView都会调用此方法,获得当前所需要的view样式
         */
        @Override
        public int getItemViewType(int position) {
            Object obj = mList.get(position);
            if (obj instanceof ArticleItem) {
                return TYPE_0;
            } else if (obj instanceof PhonePhotoItem) {
                return TYPE_1;
            } else {
                return TYPE_2;
            }
        }

        @Override
        public int getViewTypeCount() {
            return VIEW_TYPE;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TechHolder techHolder = null;
            PhotoHolder photoHolder = null;
            BlogHolder blogHolder = null;

            ArticleItem techItem = null;
            PhonePhotoItem photoItem = null;
            BlogItem blogItem = null;

            Object obj = mList.get(position);
            if (obj instanceof ArticleItem) {
                techItem = (ArticleItem) obj;
            } else if (obj instanceof PhonePhotoItem) {
                photoItem = (PhonePhotoItem) obj;
            } else {
                blogItem = (BlogItem) obj;
            }

            int viewType = getItemViewType(position);

            if (convertView == null) {
                // 首页科技资讯
                switch (viewType) { // 按当前所需的样式,确定new的布局
                case TYPE_0:
                    techHolder = new TechHolder();
                    convertView = View.inflate(mContext,
                            R.layout.item_index_intro_lv, null);
                    techHolder.img = (ImageView) convertView
                            .findViewById(R.id.img);
                    techHolder.title = (TextView) convertView
                            .findViewById(R.id.title);
                    techHolder.body = (TextView) convertView
                            .findViewById(R.id.body);
                    techHolder.date = (TextView) convertView
                            .findViewById(R.id.time);
                    convertView.setTag(techHolder);
                    break;
                // 美图
                case TYPE_1:
                    photoHolder = new PhotoHolder();
                    convertView = View.inflate(mContext,
                            R.layout.item_phone_photo_lv, null);
                    photoHolder.img = (ImageView) convertView
                            .findViewById(R.id.img);
                    photoHolder.text = (TextView) convertView
                            .findViewById(R.id.text);
                    convertView.setTag(photoHolder);
                    break;
                // 新闻博客
                case TYPE_2:
                    blogHolder = new BlogHolder();
                    convertView = View.inflate(mContext,
                            R.layout.item_fresh_bolg_lv, null);
                    blogHolder.title = (TextView) convertView
                            .findViewById(R.id.title);
                    blogHolder.uPic = (CircleImageView) convertView
                            .findViewById(R.id.image);
                    blogHolder.name = (TextView) convertView
                            .findViewById(R.id.name);
                    blogHolder.published = (TextView) convertView
                            .findViewById(R.id.publish);
                    blogHolder.summary = (TextView) convertView
                            .findViewById(R.id.summary);
                    blogHolder.viewsTv = (TextView) convertView
                            .findViewById(R.id.views_tx);
                    blogHolder.diggsTv = (TextView) convertView
                            .findViewById(R.id.diggs_tx);
                    blogHolder.commentsTv = (TextView) convertView
                            .findViewById(R.id.comment_tx);
                    blogHolder.diggs = (LinearLayout) convertView
                            .findViewById(R.id.hots_diggs);
                    blogHolder.views = (LinearLayout) convertView
                            .findViewById(R.id.hots_views);
                    blogHolder.comment = (LinearLayout) convertView
                            .findViewById(R.id.hots_comment);
                    convertView.setTag(blogHolder);
                    break;
                }

            } else {
                switch (viewType) {
                case TYPE_0:
                    techHolder = (TechHolder) convertView.getTag();
                    break;

                case TYPE_1:
                    photoHolder = (PhotoHolder) convertView.getTag();
                    break;

                case TYPE_2:
                    blogHolder = (BlogHolder) convertView.getTag();
                    break;
                }
            }

            switch (viewType) {
            case TYPE_0:
                if (techItem != null) {
                    if (!TextUtils.isEmpty(techItem.getPicUrl())) {
                        Picasso.with(mContext).load(techItem.getPicUrl())
                                .placeholder(R.color.ECECEC)
                                .error(R.color.ECECEC).into(techHolder.img);
                    }
                    if (!TextUtils.isEmpty(techItem.getTitle())) {
                        techHolder.title.setText(techItem.getTitle());
                    } else {
                        techHolder.title.setText("");
                    }
                    if (!TextUtils.isEmpty(techItem.getTitle())) {
                        techHolder.body.setText(techItem.getContent());
                    } else {
                        techHolder.body.setText("");
                    }
                    if (!TextUtils.isEmpty(techItem.getTitle())) {
                        techHolder.date.setText(techItem.getDate());
                    } else {
                        techHolder.date.setText("");
                    }
                }
                break;

            case TYPE_1:
                if (photoItem != null) {
                    if (!TextUtils.isEmpty(photoItem.getPic())) {
                        Picasso.with(mContext).load(photoItem.getPic())
                                .placeholder(R.color.ECECEC)
                                .error(R.color.ECECEC).into(photoHolder.img);
                    }

                    if (!TextUtils.isEmpty(photoItem.getTitle())) {
                        photoHolder.text.setText(photoItem.getTitle());
                    } else {
                        photoHolder.text.setText("");
                    }
                }
                break;

            case TYPE_2:
                if (blogItem != null) {
                    blogHolder.title.setText(blogItem.getTitle());
                    blogHolder.name.setText(blogItem.getName());
                    blogHolder.summary.setText(blogItem.getSummary());

                    if (!TextUtils.isEmpty(blogItem.getAvatar())) {
                        Picasso.with(mContext).load(blogItem.getAvatar())
                                .placeholder(R.drawable.touxiang)
                                .error(R.drawable.touxiang)
                                .into(blogHolder.uPic);
                    }

                    if (!TextUtils.isEmpty(blogItem.getPublished())) {
                        blogHolder.published.setText(DateUtils
                                .convertGMTToLoacale(blogItem.getPublished()));
                    }

                    if (!TextUtils.isEmpty(blogItem.getViews())) {
                        blogHolder.viewsTv.setText(blogItem.getViews());
                    } else {
                        blogHolder.viewsTv.setText("");
                    }

                    if (!TextUtils.isEmpty(blogItem.getComments())) {
                        blogHolder.commentsTv.setText(blogItem.getComments());
                    } else {
                        blogHolder.commentsTv.setText("");
                    }

                    if (!TextUtils.isEmpty(blogItem.getDiggs())) {
                        blogHolder.diggsTv.setText(blogItem.getDiggs());
                    } else {
                        blogHolder.diggsTv.setText("");
                    }
                }
                break;
            default:
                break;
            }

            return convertView;

        }

    }

    static class TechHolder {
        ImageView img;
        TextView title;
        TextView body;
        TextView date;
    }

    static class PhotoHolder {
        ImageView img;
        TextView text;
    }

    static class BlogHolder {
        TextView title;
        CircleImageView uPic;
        TextView summary;
        TextView published;
        TextView viewsTv;
        TextView diggsTv;
        TextView name;
        TextView commentsTv;
        TextView textViews;
        LinearLayout views;
        LinearLayout diggs;
        LinearLayout comment;
    }

2.RecycleView的Adapter

public class CityAdapter extends RecyclerView.Adapter {
    private final int TITLE_TYPE = 1;
    private final int CONTENT_TYPE = 2;
    private List mList = new ArrayList<>();
    private OnItemOnClickListener mOnItemOnClickListener;
    public CityAdapter(List  list) {
        this.mList = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View tv_ItemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_city_title, parent, false);
        View iv_ItemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_city_content, parent, false);
        RecyclerView.ViewHolder holder = null;
        switch (viewType) {
            case TITLE_TYPE:
                holder = new TitleView(tv_ItemView);
                break;
            case CONTENT_TYPE:
                holder = new ContentView(iv_ItemView);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        if (getItemViewType(position) == TITLE_TYPE) {
            ((TitleView) holder).mTitle.setText(mList.get(position).getCity());
        } else if (getItemViewType(position) == CONTENT_TYPE) {
            ((ContentView) holder).mCity.setText(mList.get(position).getCity());
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mOnItemOnClickListener!=null){
                        mOnItemOnClickListener.onClick(position,holder.itemView);
                    }
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }


    @Override
    public int getItemViewType(int position) {
            if (mList.get(position).getCity().length() > 1)
                return CONTENT_TYPE;
            else
                return TITLE_TYPE;
    }

    public class TitleView extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView mTitle;

        public TitleView(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class ContentView extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_city)
        TextView mCity;

        public ContentView(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
      }
    }
    public void setmOnItemOnClickListener(OnItemOnClickListener onItemOnClickListener) {
        if (onItemOnClickListener != null) {
            mOnItemOnClickListener = onItemOnClickListener;
        }
    }
    public interface OnItemOnClickListener {
        void onClick(int position, View view);
    }
}

你可能感兴趣的:(ListView实现多种Item的复杂布局)