美文网首页
Android中实现RecyclerView的多布局效果

Android中实现RecyclerView的多布局效果

作者: 我挺平凡 | 来源:发表于2019-02-27 15:42 被阅读0次

效果图展示


效果图.png

这个是RecyclerView的多布局效果。用的是轮播图和加载网络数据做的效果,下面是代码案例:

public class MyListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    private ArrayList<BannerBean.DataBean> bannerList;
    private ArrayList<NewslistBean> articleList;

    public MyAdapter(Context context, ArrayList<BannerBean.DataBean> bannerList, ArrayList<NewslistBean> articleList) {
        this.context = context;
        this.bannerList = bannerList;
        this.articleList = articleList;
    }

    public void setBannerList(ArrayList<BannerBean.DataBean> bannerList) {
        this.bannerList = bannerList;
    }

    public void setArticleList(ArrayList<NewslistBean> articleList) {
        this.articleList = articleList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        RecyclerView.ViewHolder holder = null;
        //如果条目的类型等于1,加载轮播图,否则加载文章列表
        if (i == 1) {
            View view = LayoutInflater.from(context).inflate(R.layout.layout_banner, null);
            holder = new BannnerViewHolder(view);
        } else {
            View view = LayoutInflater.from(context).inflate(R.layout.layout_list, null);
            holder = new ArticleViewHolder(view);
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int i) {

        if (viewHolder instanceof BannnerViewHolder) {
            BannnerViewHolder bannnerViewHolder = (BannnerViewHolder) viewHolder;//强转成子类
            bannnerViewHolder.banner.setImages(bannerList);
            bannnerViewHolder.banner.setImageLoader(new ImageLoader() {
                @Override
                public void displayImage(Context context, Object path, ImageView imageView) {
                    BannerBean.DataBean dataBean = (BannerBean.DataBean) path;
                    Glide.with(context).load(dataBean.getImagePath()).into(imageView);
                }
            });
            bannnerViewHolder.banner.start();
        } else if (viewHolder instanceof ArticleViewHolder) {

            ArticleViewHolder articleViewHolder = (ArticleViewHolder) viewHolder;

            int newPosition = i;
            if (bannerList.size() > 0) {
                newPosition = i - 1;
            }

            final NewslistBean newslistBean = articleList.get(newPosition);
            articleViewHolder.tv1.setText(newslistBean.getTitle());

            RequestOptions options = new RequestOptions().circleCrop();
            Glide.with(context).load(newslistBean.getPicUrl()).apply(options).into(articleViewHolder.iv);

            articleViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if (setOnClickLongListener != null) {
                        setOnClickLongListener.OnClickListener(newslistBean);
                    }
                    return false;
                }
            });
        }
    }
    //例:文章列表默认加载20条数据,现在我们布局中又多了一个控件,现在的长度就变成了21,所以需要考虑轮播图加载或没加载
    @Override
    public int getItemCount() {
        if (bannerList.size() > 0) {
            return articleList.size() + 1;
        } else {
            return articleList.size();
        }
    }
     //根据条件返回条目的类型
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return 1;
        } else {
            return 2;
        }
    }

    public class BannnerViewHolder extends RecyclerView.ViewHolder {
        private Banner banner;

        public BannnerViewHolder(@NonNull View itemView) {
            super(itemView);
            banner = itemView.findViewById(R.id.banner);
        }
    }

    public class ArticleViewHolder extends RecyclerView.ViewHolder {
        private ImageView iv;
        private TextView tv1;

        public ArticleViewHolder(@NonNull View itemView) {
            super(itemView);
            iv = itemView.findViewById(R.id.iv);
            tv1 = itemView.findViewById(R.id.tv1);
        }
    }
}

相关文章

网友评论

      本文标题:Android中实现RecyclerView的多布局效果

      本文链接:https://www.haomeiwen.com/subject/wqjfuqtx.html