今天看到公司效果图时,是一脸懵逼。上一个项目就是由于同事把布局写死还不支持实时刷新导致改了又改。这回打算写一下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()); } } } }
接下来给大家看一下效果