Recyclview复杂布局的实现

本文介绍了如何在RecyclerView中实现多种不同的布局方式。针对布局不固定且需要实时刷新的需求,通过在onCreateViewHolder中根据viewType判断布局类型,并结合getItemViewType方法来实现。示例中展示了如何将五个不同数据对象整合到一个Bean中,从而达到灵活布局的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看到公司效果图时,是一脸懵逼。上一个项目就是由于同事把布局写死还不支持实时刷新导致改了又改。这回打算写一下recyclview的多个布局。

首先查了一下相关资料,当 item 的布局方式不一样的时候,需在 onCreateViewHolder 中 通过参数 viewType 判断布局类型,此 viewType 和通过 getItemViewType 中返回的类型所匹配,getItemViewType 比 onCreateViewHolder 早调用。

@Override
public int getItemViewType(int position) {
    return homeKinds.get(position).getType();
}
该方法返回的就是布局类型,然后在onCreateViewHolder 中进行判断

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = null;
    RecyclerView.ViewHolder holer = null;
    Log.e("onCreateViewHolder: ", viewType + "");
    switch (viewType) {
        case HomeBean.ARTICLE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_article, parent, false);
            holer = new HAHolder(view, myItemClickListener);
            break;
        case HomeBean.HOSPTAL:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_teethhos, parent, false);
            holer = new TTHolder(view, myItemClickListener);
            break;
        case HomeBean.LIVE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_live, parent, false);
            holer = new HLHolder(view, myItemClickListener);
            break;
        case HomeBean.CIRCLE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_frinder, parent, false);
            holer = new FHolder(view, myItemClickListener);
            break;
        case HomeBean.ONLINE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_homeonline, parent, false);
            holer = new HOHolder(view, myItemClickListener);
            break;
    }
    return holer;

}
可以看到我这里有5个不一样的item,接下来就是为每个不同的布局加载数据:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    switch (getItemViewType(position)) {
        case HomeBean.ARTICLE:
            HAHolder hlHolder = (HAHolder) holder;
            hlHolder.name.setText(homeKinds.get(position).getIconname());
            Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hlHolder.icon);
            Glide.with(mContext).load(homeKinds.get(position).getArticleimage()).into(hlHolder.articleimage);
            hlHolder.articletime.setText(homeKinds.get(position).getArticletime());
            hlHolder.articletext.setText(homeKinds.get(position).getArticlecontent());
            break;
        case HomeBean.HOSPTAL:
            TTHolder ttHolder = (TTHolder) holder;
            ttHolder.name.setText(homeKinds.get(position).getIconname());
            Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(ttHolder.icon);
            ttHolder.teethaddress.setText("地址:" + homeKinds.get(position).getHosptalAddress());
            ttHolder.teethprise.setText("好评:" + DecimalFormaTools.format2(homeKinds.get(position).getHosptalprise()) + "%");
            Glide.with(mContext).load(homeKinds.get(position).getHosptalimage()).into(ttHolder.teethimage);
            ttHolder.teethyewu.setText("主营业务:" + homeKinds.get(position).getHosptalcontent());
            ttHolder.teethname.setText(homeKinds.get(position).getHosptalname());
            break;
        case HomeBean.LIVE:
            HLHolder hlHolder1 = (HLHolder) holder;
            hlHolder1.name.setText(homeKinds.get(position).getIconname());
            Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hlHolder1.icon);
            hlHolder1.livename.setText(homeKinds.get(position).getLivename());
            Glide.with(mContext).load(homeKinds.get(position).getLiveimage()).into(hlHolder1.liveimage);
            hlHolder1.seenum.setText(homeKinds.get(position).getLivenum() + "人观看");
            break;
        case HomeBean.CIRCLE:
            FHolder fHolder = (FHolder) holder;
            fHolder.name.setText(homeKinds.get(position).getIconname());
            Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(fHolder.icon);
            fHolder.ciecleseenum.setText(homeKinds.get(position).getCirclenum() + "以浏览");
            fHolder.circlecontent.setText(homeKinds.get(position).getCirclecontent());
            fHolder.circletitle.setText(homeKinds.get(position).getCircletitle());
            fHolder.circlehname.setText(homeKinds.get(position).getCirclename());
            fHolder.circletime.setText(homeKinds.get(position).getCircletime());
            Glide.with(mContext).load(homeKinds.get(position).getCircleimage()).into(fHolder.circleimage);
            break;
        case HomeBean.ONLINE:
            HOHolder hoHolder = (HOHolder) holder;
            hoHolder.name.setText(homeKinds.get(position).getIconname());
            Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hoHolder.icon);
            Glide.with(mContext).load(homeKinds.get(position).getOnlineimage()).into(hoHolder.onlineimage);
            Glide.with(mContext).load(homeKinds.get(position).getOnlineuserimage()).into(hoHolder.onlineuserimage);
            hoHolder.onlinetxt.setText(homeKinds.get(position).getOnlinetxt());
            hoHolder.onlineusertxt.setText(homeKinds.get(position).getOnlineusertxt());
            break;
    }
}

下面给大家完整代码

数据类型,由于返回的是5个对象。自己就又写了一个对象所有数据都添加到自己的Bean里:

/**
 * Created by Sxw on 2017/9/14.
 */

public class HomeBean {
    public static final int ARTICLE = 0; //view类型0
    public static final int HOSPTAL = 1; //view类型1
    public static final int LIVE = 2;//view 类型2
    public static final int CIRCLE = 3; //view类型3
    public static final int ONLINE = 4;//view 类型4
    private String iconimage;
    private String iconname;
    private String articletime;
    private String articlecontent;
    private String articleimage;
    private String hosptalimage;
    private String hosptalname;
    private double hosptalprise;
    private String hosptalcontent;

    public String getHosptalAddress() {
        return hosptalAddress;
    }

    public void setHosptalAddress(String hosptalAddress) {
        this.hosptalAddress = hosptalAddress;
    }

    private String hosptalAddress;
    private String liveimage;
    private String livename;
    private int livenum;
    private String circleimage;
    private String circlename;
    private String circletitle;
    private String circlecontent;
    private String circletime;
    private String circlenum;
    private String onlineuserimage;
    private String onlineimage;
    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    private int type;
    public String getIconimage() {
        return iconimage;
    }

    public void setIconimage(String iconimage) {
        this.iconimage = iconimage;
    }

    public String getIconname() {
        return iconname;
    }

    public void setIconname(String iconname) {
        this.iconname = iconname;
    }

    public String getArticletime() {
        return articletime;
    }

    public void setArticletime(String articletime) {
        this.articletime = articletime;
    }

    public String getArticlecontent() {
        return articlecontent;
    }

    public void setArticlecontent(String articlecontent) {
        this.articlecontent = articlecontent;
    }

    public String getArticleimage() {
        return articleimage;
    }

    public void setArticleimage(String articleimage) {
        this.articleimage = articleimage;
    }

    public String getHosptalimage() {
        return hosptalimage;
    }

    public void setHosptalimage(String hosptalimage) {
        this.hosptalimage = hosptalimage;
    }

    public String getHosptalname() {
        return hosptalname;
    }

    public void setHosptalname(String hosptalname) {
        this.hosptalname = hosptalname;
    }

    public double getHosptalprise() {
        return hosptalprise;
    }

    public void setHosptalprise(double hosptalprise) {
        this.hosptalprise = hosptalprise;
    }

    public String getHosptalcontent() {
        return hosptalcontent;
    }

    public void setHosptalcontent(String hosptalcontent) {
        this.hosptalcontent = hosptalcontent;
    }

    public String getLiveimage() {
        return liveimage;
    }

    public void setLiveimage(String liveimage) {
        this.liveimage = liveimage;
    }

    public String getLivename() {
        return livename;
    }

    public void setLivename(String livename) {
        this.livename = livename;
    }

    public int getLivenum() {
        return livenum;
    }

    public void setLivenum(int livenum) {
        this.livenum = livenum;
    }

    public String getCircleimage() {
        return circleimage;
    }

    public void setCircleimage(String circleimage) {
        this.circleimage = circleimage;
    }

    public String getCirclename() {
        return circlename;
    }

    public void setCirclename(String circlename) {
        this.circlename = circlename;
    }

    public String getCircletitle() {
        return circletitle;
    }

    public void setCircletitle(String circletitle) {
        this.circletitle = circletitle;
    }

    public String getCirclecontent() {
        return circlecontent;
    }

    public void setCirclecontent(String circlecontent) {
        this.circlecontent = circlecontent;
    }

    public String getCircletime() {
        return circletime;
    }

    public void setCircletime(String circletime) {
        this.circletime = circletime;
    }

    public String getCirclenum() {
        return circlenum;
    }

    public void setCirclenum(String circlenum) {
        this.circlenum = circlenum;
    }

    public String getOnlineuserimage() {
        return onlineuserimage;
    }

    public void setOnlineuserimage(String onlineuserimage) {
        this.onlineuserimage = onlineuserimage;
    }

    public String getOnlineimage() {
        return onlineimage;
    }

    public void setOnlineimage(String onlineimage) {
        this.onlineimage = onlineimage;
    }

    public String getOnlineusertxt() {
        return onlineusertxt;
    }

    public void setOnlineusertxt(String onlineusertxt) {
        this.onlineusertxt = onlineusertxt;
    }

    public String getOnlinetxt() {
        return onlinetxt;
    }

    public void setOnlinetxt(String onlinetxt) {
        this.onlinetxt = onlinetxt;
    }

    private String onlineusertxt;
    private String onlinetxt;
}
Adapter的代码,其中MyItemClickListener是自定的item点击时间

public interface MyItemClickListener {
    void onItemClick(View view, int position);//view是itemview,position是
getLayoutPosition()返回的点击item的位置
}
/**
 * Created by Sxw on 2017/9/12.
 */

public class HomeAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private List<HomeBean> homeKinds;
    private Context mContext;
    private MyItemClickListener myItemClickListener;

    public HomeAdapter(Context context, List<HomeBean> homeKinds) {
        this.mContext = context;
        this.homeKinds = homeKinds;
    }

    @Override
    public int getItemViewType(int position) {
        return homeKinds.get(position).getType();
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = null;
        RecyclerView.ViewHolder holer = null;
        Log.e("onCreateViewHolder: ", viewType + "");
        switch (viewType) {
            case HomeBean.ARTICLE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_article, parent, false);
                holer = new HAHolder(view, myItemClickListener);
                break;
            case HomeBean.HOSPTAL:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_teethhos, parent, false);
                holer = new TTHolder(view, myItemClickListener);
                break;
            case HomeBean.LIVE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_live, parent, false);
                holer = new HLHolder(view, myItemClickListener);//直播
                break;
            case HomeBean.CIRCLE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_frinder, parent, false);
                holer = new FHolder(view, myItemClickListener);//牙友圈子
                break;
            case HomeBean.ONLINE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_homeonline, parent, false);
                holer = new HOHolder(view, myItemClickListener);//在线咨询
                break;
        }
        return holer;

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case HomeBean.ARTICLE:
                HAHolder hlHolder = (HAHolder) holder;
                hlHolder.name.setText(homeKinds.get(position).getIconname());
                Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hlHolder.icon);
                Glide.with(mContext).load(homeKinds.get(position).getArticleimage()).into(hlHolder.articleimage);
                hlHolder.articletime.setText(homeKinds.get(position).getArticletime());
                hlHolder.articletext.setText(homeKinds.get(position).getArticlecontent());
                break;
            case HomeBean.HOSPTAL:
                TTHolder ttHolder = (TTHolder) holder;
                ttHolder.name.setText(homeKinds.get(position).getIconname());
                Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(ttHolder.icon);
                ttHolder.teethaddress.setText("地址:" + homeKinds.get(position).getHosptalAddress());
                ttHolder.teethprise.setText("好评:" + DecimalFormaTools.format2(homeKinds.get(position).getHosptalprise()) + "%");
                Glide.with(mContext).load(homeKinds.get(position).getHosptalimage()).into(ttHolder.teethimage);
                ttHolder.teethyewu.setText("主营业务:" + homeKinds.get(position).getHosptalcontent());
                ttHolder.teethname.setText(homeKinds.get(position).getHosptalname());
                break;
            case HomeBean.LIVE:
                HLHolder hlHolder1 = (HLHolder) holder;
                hlHolder1.name.setText(homeKinds.get(position).getIconname());
                Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hlHolder1.icon);
                hlHolder1.livename.setText(homeKinds.get(position).getLivename());
                Glide.with(mContext).load(homeKinds.get(position).getLiveimage()).into(hlHolder1.liveimage);
                hlHolder1.seenum.setText(homeKinds.get(position).getLivenum() + "人观看");
                break;
            case HomeBean.CIRCLE:
                FHolder fHolder = (FHolder) holder;
                fHolder.name.setText(homeKinds.get(position).getIconname());
                Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(fHolder.icon);
                fHolder.ciecleseenum.setText(homeKinds.get(position).getCirclenum() + "以浏览");
                fHolder.circlecontent.setText(homeKinds.get(position).getCirclecontent());
                fHolder.circletitle.setText(homeKinds.get(position).getCircletitle());
                fHolder.circlehname.setText(homeKinds.get(position).getCirclename());
                fHolder.circletime.setText(homeKinds.get(position).getCircletime());
                Glide.with(mContext).load(homeKinds.get(position).getCircleimage()).into(fHolder.circleimage);
                break;
            case HomeBean.ONLINE:
                HOHolder hoHolder = (HOHolder) holder;
                hoHolder.name.setText(homeKinds.get(position).getIconname());
                Glide.with(mContext).load(homeKinds.get(position).getIconimage()).into(hoHolder.icon);
                Glide.with(mContext).load(homeKinds.get(position).getOnlineimage()).into(hoHolder.onlineimage);
                Glide.with(mContext).load(homeKinds.get(position).getOnlineuserimage()).into(hoHolder.onlineuserimage);
                hoHolder.onlinetxt.setText(homeKinds.get(position).getOnlinetxt());
                hoHolder.onlineusertxt.setText(homeKinds.get(position).getOnlineusertxt());
                break;
        }
    }

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

    //文章的header
    private class HAHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView icon;
        private RoundImageView articleimage;
        private TextView name, articletext, articletime;
        private MyItemClickListener myItemClickListener;

        public HAHolder(View itemView, MyItemClickListener myItemClickListener) {
            super(itemView);
            this.myItemClickListener = myItemClickListener;
            icon = (ImageView) itemView.findViewById(R.id.icon);
            articleimage = (RoundImageView) itemView.findViewById(R.id.articleimage);
            name = (TextView) itemView.findViewById(R.id.name);
            articletext = (TextView) itemView.findViewById(R.id.articletext);
            articletime = (TextView) itemView.findViewById(R.id.articletime);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (myItemClickListener != null) {
                myItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }

    public void setMyItemClickListener(MyItemClickListener myItemClickListener) {
        this.myItemClickListener = myItemClickListener;
    }

    //直播
    private class HLHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView icon, liveimage;
        private TextView livename, seenum, name;
        private MyItemClickListener myItemClickListener;

        public HLHolder(View view, MyItemClickListener myItemClickListener) {
            super(view);
            this.myItemClickListener = myItemClickListener;
            icon = (ImageView) view.findViewById(R.id.icon);
            liveimage = (ImageView) view.findViewById(R.id.liveimage);
            livename = (TextView) view.findViewById(R.id.livename);
            seenum = (TextView) view.findViewById(R.id.seenum);
            name = (TextView) view.findViewById(R.id.name);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (myItemClickListener != null) {
                myItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }

    //牙所
    private class TTHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView icon;
        private TextView name, teethname, teethprise, teethyewu, teethaddress;
        private RoundImageView teethimage;
        private MyItemClickListener myItemClickListener;

        public TTHolder(View view, MyItemClickListener myItemClickListener) {
            super(view);
            this.myItemClickListener = myItemClickListener;
            icon = (ImageView) view.findViewById(R.id.icon);
            teethimage = (RoundImageView) view.findViewById(R.id.teethimage);
            teethname = (TextView) view.findViewById(R.id.teethname);
            teethprise = (TextView) view.findViewById(R.id.teethprise);
            teethyewu = (TextView) view.findViewById(R.id.teethyewu);
            teethaddress = (TextView) view.findViewById(R.id.teethaddress);
            name = (TextView) view.findViewById(R.id.name);
            view.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (myItemClickListener != null) {
                myItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }

    //在线咨询
    private class HOHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private RoundImageView onlineimage, onlineuserimage;
        private ImageView icon;
        private TextView name, onlineusertxt, onlinetxt;
        private MyItemClickListener myItemClickListener;

        public HOHolder(View view, MyItemClickListener myItemClickListener) {
            super(view);
            this.myItemClickListener = myItemClickListener;

            icon = (ImageView) view.findViewById(R.id.icon);
            onlineimage = (RoundImageView) view.findViewById(R.id.onlineimage);
            onlineuserimage = (RoundImageView) view.findViewById(R.id.onlineuserimage);

            onlinetxt = (TextView) view.findViewById(R.id.onlinetxt);
            onlineusertxt = (TextView) view.findViewById(R.id.onlineusertxt);
            name = (TextView) view.findViewById(R.id.name);
            view.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (myItemClickListener != null) {
                myItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }

    //圈子
    private class FHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private ImageView icon;
        private RoundImageView circleimage;
        private TextView name, circlehname, circletitle, circlecontent, circletime, ciecleseenum;
        private MyItemClickListener myItemClickListener;

        public FHolder(View view, MyItemClickListener myItemClickListener) {
            super(view);
            this.myItemClickListener = myItemClickListener;

            icon = (ImageView) view.findViewById(R.id.icon);
            circleimage = (RoundImageView) view.findViewById(R.id.circleimage);
            circlehname = (TextView) view.findViewById(R.id.circlehname);
            circletitle = (TextView) view.findViewById(R.id.circletitle);
            circlecontent = (TextView) view.findViewById(R.id.circlecontent);
            circletime = (TextView) view.findViewById(R.id.circletime);
            ciecleseenum = (TextView) view.findViewById(R.id.ciecleseenum);
            name = (TextView) view.findViewById(R.id.name);
            view.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (myItemClickListener != null) {
                myItemClickListener.onItemClick(v, getLayoutPosition());
            }
        }
    }
}

接下来给大家看一下效果


本人也是第一次写这种多布局的recyclview,有不足的地方希望大家多多包涵,同事也希望大家能多给建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值