美文网首页
Android RecyclerView 多样式布局编写

Android RecyclerView 多样式布局编写

作者: 隐姓埋名的猫大叔 | 来源:发表于2020-06-17 23:31 被阅读0次

    在Android开发中,我们总会时不时遇到列表多样式布局,比如商城的不同item 布局样式不一样,或者像打开相册,点击列表最后的添加按钮图片展示到列表上。

    现在来实现adapter多布局样式,写个初级简单的效果,理解怎么写后,后面各种复杂的多布局也能在理解后,自行编写出来

    先上效果图:


    demo展示.gif

    本demo 是基于AndroidX开发,activity的布局就是一个简单线性布局包含RecyclerView,就不贴上图了,直接来看adapter 如何编写,这里我直接上整个adapter的代码,再分开讲解每个的作用

    public class SelectAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
        private Context context;
        //布局标识集合
        private static final int TYPE_ONE = 0;//普通头像
        private static final int TYPE_TWO = 1;//添加按钮
        private List<SelectPerson> personList;
        private OnItemAdapterClickListener onItemAdapterClickListener;
    
        public SelectAdapter(Context context, OnItemAdapterClickListener onItemAdapterClickListener) {
            this.context = context;
            this.onItemAdapterClickListener = onItemAdapterClickListener;
        }
    
        @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            if (viewType == TYPE_ONE) {
                View mView1 = LayoutInflater.from(context).inflate(R.layout.recycle_item_head, null);
                ViewHolderHead viewHolderHead = new ViewHolderHead(mView1);
                return viewHolderHead;
            } else {
                View mView2 = LayoutInflater.from(context).inflate(R.layout.recycle_item_add, null);
                ViewHolderAdd viewHolderHead = new ViewHolderAdd(mView2);
                return viewHolderHead;
            }
        }
    
        @Override
        public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int position) {
            if (holder instanceof ViewHolderHead) {
                ((ViewHolderHead) holder).tv_name.setText(personList.get(position).getName());
                //头像删除按钮点击
                ((ViewHolderHead) holder).img_delete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onItemAdapterClickListener.onItemClickEvent(view, position);
                    }
                });
            } else if (holder instanceof ViewHolderAdd) {
                //添加按钮点击
                ((ViewHolderAdd) holder).ly_add.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        onItemAdapterClickListener.onItemClickEvent(v, position);
                    }
                });
            }
        }
    
        @Override
        public int getItemCount() {
            return personList == null ? 0 : personList.size();
        }
    
        @Override
        public int getItemViewType(int position) {
            if (TYPE_TWO == personList.get(position).getType()) return TYPE_TWO;
            else return TYPE_ONE;//其它返回默认情况
        }
    
    
        class ViewHolderHead extends RecyclerView.ViewHolder {
            private ImageView img_delete;
            private TextView tv_name;
    
            public ViewHolderHead(@NonNull View itemView) {
                super(itemView);
                img_delete = itemView.findViewById(R.id.img_delete);
                tv_name = itemView.findViewById(R.id.tv_name);
    
            }
        }
    
        class ViewHolderAdd extends RecyclerView.ViewHolder {
            private RelativeLayout ly_add;
    
            private ViewHolderAdd(@NonNull View itemView) {
                super(itemView);
                ly_add = itemView.findViewById(R.id.ly_add);
            }
        }
    
        public void reFreshData(List<SelectPerson> personList) {
            this.personList = personList;
            notifyDataSetChanged();
        }
    
        public interface OnItemAdapterClickListener {
            void onItemClickEvent(View view, int selectPosition);
        }
    }
    

    SelectAdapter 构造函数传入 上下文和接口变量,其中onItemAdapterClickListener 用于实现外部对内部的头像删除和添加的的接口回调监听,用于处理内部控件点击事件

    onCreateViewHolder用于初始化和创建一个holder供RecyclerView使用,holder 我们这边定义了两种,分别是ViewHolderHead 用于展示头像,姓名 和 ViewHolderAdd 添加按钮 ,两者的xml 视图 贴一下,布局代码就不贴了,相信各位小伙伴一眼就瞅出我怎么写,甚至写的比我更好
    截图如下:


    recycle_item_head.png recycle_item_add.png

    getItemViewType 则是返回新视图的的视图类型,用来区分ViewType

    在onBindViewHolder 方法中将给定视图绑定到相关位置,我在里面实现了头像的删除和添加按钮的点击相关逻辑,通过接口在外部解决

    reFreshData 则是我用于数据新增或者移除后,通知RecyclerView 已经被更改

    SelectPerson 是自己定义的bean类

    public class SelectPerson {
        private int type;//0-默认头像 1-添加按钮
        private String name;
    
        public SelectPerson(int type,String name) {
            this.type = type;
            this.name=name;
        }
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    现在回到MainActivity,我们在绑定完RecyclerView后,初始化SelectAdapter,并且自己添加一些数据,设置布局管理器为网格布局
    代码如下:

        private void initAdapter() {
            final List<SelectPerson> list = new ArrayList<>();
            ry_item = findViewById(R.id.ry_item);
            for (int i = 0; i < 7; i++) {
                list.add(new SelectPerson(0, "name" + i));
            }
            list.add(new SelectPerson(1, "添加按钮"));
            selectAdapter = new SelectAdapter(this, new SelectAdapter.OnItemAdapterClickListener() {
                @Override
                public void onItemClickEvent(View view, int selectPosition) {
                    //此处为内部点击按钮
                    switch (view.getId()) {
                        case R.id.img_delete:
                            Toast.makeText(MainActivity.this, "删除点击", Toast.LENGTH_SHORT).show();
                            list.remove(selectPosition);
                            selectAdapter.reFreshData(list);
                            break;
                        case R.id.ly_add:
                            list.add(list.size() - 1, new SelectPerson(0, "新增人物"));
                            selectAdapter.reFreshData(list);
                            Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show();
                            break;
                    }
                }
            });
            ry_item.setLayoutManager(new GridLayoutManager(this, 5));
            ry_item.setAdapter(selectAdapter);
            selectAdapter.reFreshData(list);
        }
    
    

    初级的多样式布局就已经完成了 ,希望能对阅读这篇文章的各位帮上一点小忙,最初我刚为一名新手时,也是通过各个网站博客的开发者们提供的技术文章,解决了在我当时看来难度很大的问题,今后会慢慢继续写一些文章,当作对自己的复习,同时又能帮上当初和我一样刚入行的开发者

    相关文章

      网友评论

          本文标题:Android RecyclerView 多样式布局编写

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